====== 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();
}