2012-07-27 3 views
0

스프링 애플리케이션에서 서비스 레이어 메소드는 @Transactional(propagation=Propagation.REQUIRED)으로 표시되고 <tx:annotation-driven />을 사용하고 있습니다. 일반적으로 메소드가 완료되면 자동으로 트랜잭션을 커밋하는 기본 동작은 매력처럼 작동합니다. 그러나 특별한 경우에, 메소드 끝나기 직전에 커밋해야합니다. 그렇습니다. 그 시점 이후의 부분이 예외를 던지더라도 말입니다.스프링 트랜잭션 주석 - 활성 트랜잭션 받기

현재 트랜잭션에 액세스 할 수있는 방법이 있습니까? 하는 것,이 것으로 보인다 타임 스탬프에서methodThatNeedsToBeCalledAfterCommit() 후 한 번 발생 | "트랜잭션이 커밋 초기화 AbstractPlatformTransactionManager.processCommit (752)"및

TransactionDefinition td = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_MANDATORY); // make sure we're talking about the same transaction already provided by the annotation 
TransactionStatus status = transactionManager.getTransaction(td); 

// perform various JDBC operations 

transactionManager.commit(status); 
methodThatNeedsToBeCalledAfterCommit(); 

하지만 내 로그를보고, 나는 단지 참조 :이 시도 @Transactional 메소드에 대한 정상적인 동작입니다.

실제로 이러한 방법으로 커밋을 강제하는 방법이 있습니까?

답변

1

나는 그렇게 생각하지 않는다. 또한 Spring은 메서드가 끝나면 다시 시도하려고 시도합니다. 그래서 2 명이 커밋합니다.

방법 구성을 재고해야합니다. 두 가지 방법으로 기존의 것을 나눌 수 있습니다. 하나는 @Trnasactional이고 다른 하나는 남은 선입니다.

+0

글쎄, 나는 결국 반드시 다시 생각하지 않을 것이다. 그러나 디자인 관점에서 볼 때 이는 실제로 하나의 방법에 속합니다. – Dan

+0

이 방법에 대한 주석을 사용하지 말고 수동 변환 방법을 사용하십시오. 거래를 완벽하게 제어 할 수 있습니다. –

+0

글쎄, 위의 코드는 어쨌든 수동 일을 꽤 많이하고있다? 그래서 나는 그걸로 괜찮습니다. 하지만 이미 사용하고있는 것과 동일한 트랜잭션을 사용할 수 있기를 원합니다. 특히이 메소드는'@ Rollback'이 설정된 JUnit 테스트에서 호출되기 때문에 특히 그렇습니다. – Dan

0

이것은 기본 트랜잭션 전파가 PROPAGATION_REQUIRED이고 전체 트랜잭션이 완료된 경우에만 커밋되기 때문일 수 있습니다. 이는 외부 메서드입니다. 당신은 PROPAGATION_REQUIRES_NEW으로 시도 할 수 있습니다 :

td.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

또 다른 대안은

0

TransactionTemplate 당신이 트랜잭션을 적용 할 프로그램이 호출이 방법을 시도 사용하는 것입니다.

 DefaultTransactionDefinition transdefinition = new DefaultTransactionDefinition(); 
     PlatformTransactionManager manager =new PlatformTransactionManager(); 
     TransactionStatus status=null; 




public void beginTransaction() 
    { 

     transdefinition.setPropagationBehavior(0); 


     status = manager.getTransaction(transdefinition); 
    } 

public void commitTransaction() 
    { 
if(status.isCompleted()){ 
manager.commit(status); 
    } 
} 

public void rollbackTransaction() 
    { 
if(!status.isCompleted()){ 
     manager.rollback(status); 
    } 
} 
관련 문제