2017-04-05 26 views
1

프로젝트에서 Spring 4, Java 7을 사용하고 Oracle과 PostgreSQL에 지속됩니다.동일한 프로세스에서 다중 Spring @ Transactional 롤백이 지원됩니까?

두 데이터베이스에 데이터를 유지하는 서비스에 대한 통합 테스트를 작성하고 있습니다. 통합 테스트를 위해 두 트랜잭션을 자동으로 롤백하려고합니다. Java 8을 사용하지 않는다면 "반복 된"주석을 사용할 수 없다는 것을 알고 있습니다. 컴파일 오류가 발생합니다. 하나의 주석을 클래스 수준에 넣고 다른 하나는 메서드 수준에서 컴파일하면됩니다. 그러나 나열된 상위 주석은 롤백되지 않습니다. 명확히하기 위해 클래스 또는 메소드 레벨에서 주석 (Oracle 또는 PostgreSQL) 중 하나를 독립형 주석으로 선언하면 그 하나의 롤백이 완벽하게 작동합니다. 그러나 클래스 레벨에서 하나의 주석을, 메소드 레벨에서 다른 주석을 구현하면 롤백은 메소드 레벨에서만 작동하고 클래스 레벨에서는 작동하지 않습니다.

나는 프로세스가 한 번에 하나씩 만 롤백하려고하는 한 여러 개의 @Transactional 주석이 잘 작동한다고 생각합니다. 예 : 한 가지 방법은 Oracle Transaction을 사용하고 다른 방법은 PostgreSQL 트랜잭션을 사용합니다.

의견이 있으십니까?

답변

4

좋아요, 어떻게하는지 알아 냈습니다. ChainedTransactionManager라는 클래스가있는 별도의 SpringFramework 프로젝트 "spring-data-commons"가 있습니다.

<bean id="chainedTransactionManager" 
      class="org.springframework.data.transaction.ChainedTransactionManager"> 
     <constructor-arg> 
      <list> 
       <ref bean="postgresqlTransactionManager"/> 
       <ref bean="oracleTransactionManager"/> 
      </list> 
     </constructor-arg> 
    </bean> 

가 그럼 난 내 주석이 변경 한 후 예상대로 두 트랜잭션이 롤백

@Transactional(transactionManager = "chainedTransactionManager") 

의 chainedTransactionManager을 사용하여 다음과 같이 나는 콩을 유선.