경고 : Spring 4.1.4 미만 버전의 경우 TransactionManagementConfigurer로 기본 Transaction Manager를 지정하면 @Transactional(value=“다른트랜잭션매니저”) 로 명시한 경우에도 무시하고 기본 Transaction Manager를 사용하는 버그가 있다. 우회책으로 @Primary를 사용하면 된다.
[SPR-12541] @Transactional qualifier is ignored by TransactionAspectSupport if default transaction manager is set - Spring JIRA
4.1.4 버전에도 트랜잭션 관련 버그가 존재하기 때문에 4.1.5 이상 버전 사용할 것
@Transactional
에서 트랜잭션 매니저를 지정하지 않아도 XML 기반은 기본으로 transactionManager
를 디폴트 트랜잭션 매니저로 지정하지만 Java Config를 사용할 때는 모든 PlatformTransactionManager 인스턴스를 찾아서 그 중에 하나를 매핑한다.annotationDrivenTransactionManager
를 구현해서 트랜잭션 매니저를 리턴해주면 해당 매니저를 사용하게 된다.@Configuration public class TransactionManageConfig implements TransactionManagementConfigurer { // 직접 Bean으로 지정 @Bean @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource()); } // 다른 빈을 리턴 @Bean public PlatformTransactionManager txManager() { return new DataSourceTransactionManager(dataSource()); } @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return txManager(); // reference the existing @Bean method above } }
@Bean @Primary public ChainedTransactionManager transactionManager() { return new SomePlatformTransactionManager(); }