====== Spring Framework @EnableTransactionManagement ====== * [[springframework:transaction|Spring Transaction]] * [[http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/annotation/EnableTransactionManagement.html|@EnableTransactionManagement]] * [[springframework:javaconfig|Springframework Java Config]]로 애노테이션 기반 트랜잭션을 활성화 한다. > 경고 : Spring 4.1.4 미만 버전의 경우 **TransactionManagementConfigurer로 기본 Transaction Manager를 지정하면 @Transactional(value="다른트랜잭션매니저") 로 명시한 경우에도 무시하고 기본 Transaction Manager를 사용하는 버그가 있다.** 우회책으로 **@Primary**를 사용하면 된다. > [[https://jira.spring.io/browse/SPR-12541|[SPR-12541] @Transactional qualifier is ignored by TransactionAspectSupport if default transaction manager is set - Spring JIRA]] > 4.1.4 버전에도 [[https://jira.spring.io/browse/SPR-12577|트랜잭션 관련 버그]]가 존재하기 때문에 4.1.5 이상 버전 사용할 것 * ''@Transactional''에서 트랜잭션 매니저를 지정하지 않아도 XML 기반은 기본으로 ''transactionManager''를 디폴트 트랜잭션 매니저로 지정하지만 Java Config를 사용할 때는 모든 [[http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/PlatformTransactionManager.html|PlatformTransactionManager]] 인스턴스를 찾아서 그 중에 하나를 매핑한다. * 따라서 특정 트랜잭션 매니저를 디폴트로 지정하고자 한다면 Java Config 클래스가 [[http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/transaction/annotation/TransactionManagementConfigurer.html|TransactionManagementConfigurer]] 인터페이스를 구현하고 ''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 } } * 아니면 특정 트랜잭션 매니저 생성시 [[http://docs.spring.io/spring/docs/3.2.x/javadoc-api/org/springframework/context/annotation/Primary.html|@Primary]] 애노테이션을 지정한다. @Bean @Primary public ChainedTransactionManager transactionManager() { return new SomePlatformTransactionManager(); }