복붙노트

[SPRING] Spring에서 트랜잭션을 사용할 때 포스트 커밋 만들기

SPRING

Spring에서 트랜잭션을 사용할 때 포스트 커밋 만들기

내가 수동으로 트랜잭션 커밋을 수행하고 Spring PlatformTransactionManager를 사용하여 롤백했기 때문에 트랜잭션을 커밋 한 후에 커밋 조치가 발생하도록 후크를 설정해야합니다.

조사 대상 :

 void commit(TransactionStatus status) throws TransactionException;

나는 아무런 예외도 발생하지 않는다면 트랜잭션이 성공했다고 판단하는 방법을 알지 못한다.

그리고 나는 AOP를 하나의 옵션으로 사용할 수 있지만 프로그래밍 방식으로 콜백 메소드를 사용하는 것은 어떨까요?

해결법

  1. ==============================

    1.TransactionSynchronizationManager 및 TransactionSynchronization을 사용하여 원하는 것을 정확히 얻을 수 있습니다.

    TransactionSynchronizationManager 및 TransactionSynchronization을 사용하여 원하는 것을 정확히 얻을 수 있습니다.

    TransactionSynchronizationManager를 사용하면 현재 트랜잭션에 대한 정보를 가져 오는 정적 메서드가 있으며 TransactionSynchronization을 등록하면 해당 트랜잭션을 호출 할 때 자동으로 포스트 커밋을 수행 할 수 있습니다

    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
               void afterCommit(){
                    //do what you want to do after commit
               }
    })
    

    TransactionSynchronization은 스레드별로 (기본 웹 요청에는 종종 문제가되지 않음)주의해야합니다.

  2. ==============================

    2.Grooveek의 답변과 그 밑에있는 Alex의 코멘트에 대한 공감 -이 제안은 결합 된 제안이 그물 주변에서 찾기 힘든 견고하고 깨끗한 솔루션을 제공하기 때문에 여기에 넣었습니다.

    Grooveek의 답변과 그 밑에있는 Alex의 코멘트에 대한 공감 -이 제안은 결합 된 제안이 그물 주변에서 찾기 힘든 견고하고 깨끗한 솔루션을 제공하기 때문에 여기에 넣었습니다.

    Spring 4+ 사용. 성공적으로 커밋 한 후 @Transactional 메서드에 콜백이 필요한 경우 메서드 시작 부분에 추가합니다.

    @Service
    public class OneService {
    
        @Autowired
        OneDao dao;
    
        @Transactional
        public void a transactionalMethod() {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter(){
                public void afterCommit(){
                    //do stuff right after commit
                    System.out.println("commit!!!");
    
                }
            });
            //do db stuff
            dao.save();
        }
    }
    
  3. ==============================

    3.특정 이유로 인해 제 프로젝트에서 PlatformTransactionManager를 사용해야했습니다. 그래서 org.springframework.transaction.support.TransactionTemplate을 사용해야했습니다.

    특정 이유로 인해 제 프로젝트에서 PlatformTransactionManager를 사용해야했습니다. 그래서 org.springframework.transaction.support.TransactionTemplate을 사용해야했습니다.

    http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/support/TransactionTemplate.html

    주된 이점은 PlatformTransactionManager를 올바르게 구현 한 경우 수동 커밋 / 롤백을 신경 쓰지 않아도된다는 것입니다. 좀 더 구체적인 것이 필요하다면 최소한 TransactionTemplate의 소스 코드가 도움이 될 수 있습니다.

    사용법은 간단합니다.

    config.xml

    <bean name="transactionTemplate"
                class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="platformTransactionManager"/>
    </bean>
    

    MyServiceImpl.java

    
    @Service
    public class MyServiceImpl implements MyService {
    
        @Autowired
        private TransactionTemplate transactionTemplate;
    
        public Entity getSomethingWithTx(final long id) {
    
            return transactionTemplate.execute(new TransactionCallback<Entity>() {
                @Override
                public Entity doInTransaction(TransactionStatus status) {
                    //TODO implement
                }
            });
        }
    
    
  4. from https://stackoverflow.com/questions/15026142/creating-a-post-commit-when-using-transaction-in-spring by cc-by-sa and MIT license