SpringBootでのトランザクション管理

SpringBootでのトランザクション管理の設定に関して、
トランザクション管理には、TransactionManagerとTransactionInterceptorを利用します。
Springには、PlatformTransactionManagerインタフェースを実装したTransactionManager
が何種類か用意されています。

  • org.springframework.jdbc.datasource.DataSourceTransactionManager
  • org.springframework.orm.jdo.JdoTransactionManager
  • org.springframework.orm.hibernate.HibernateTransactionManager
  • org.springframework.transaction.jta.JtaTransactionManager

通常のJDBCの場合、DataSourceTransactionManagerを使います。
このDataSourceTransactionManagerは、コンストラクターにDataSourceを渡すだけです。
次に、TransactionInterceptorを設定します。
TransactionInterceptorには、下の2つを設定する必要があります。

  • TransactionManager
  • TransactionAttributeSource

TransactionAttributeSourceですが、Propertiesでも大丈夫です。
実際の定義は、Springの設定クラスに定義します。

@Bean
public TransactionInterceptor txAdvice(DataSource dataSource) {
	DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource);
	Properties attributes = new Properties();
	attributes.setProperty("*", "PROPAGATION_REQUIRED");
	TransactionInterceptor txAdvice = new TransactionInterceptor(txManager, attributes);
	return txAdvice;
}

トランザクションの設定をしたらトランザクションを掛けるクラスを指定します。
@Transactionalをクラス又はメソッド指定することで、その部分にトランザクションを掛けます。

@Transactional
public class Logic {
}

別のやり方として、ポイントカットを利用して、トランザクションを掛けることも可能です。
SpringにDefaultPointcutAdvisorと言うポイントカットクラスがあります。
DefaultPointcutAdvisorは、下記の2つを設定します。

  • TransactionInterceptor
  • AspectJExpressionPointcut

AspectJExpressionPointcutにトランザクションを掛けたいクラスを指定します。
このクラス指定にはワーイルドカードが使えます。

@Bean
public DefaultPointcutAdvisor txAdvisor(TransactionInterceptor txAdvice) {
	DefaultPointcutAdvisor txAdvisor = new DefaultPointcutAdvisor();
	txAdvisor.setAdvice(txAdvice);
	AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
	pointcut.setExpression("execution(* chronos.domain..*(..))");
	txAdvisor.setPointcut(pointcut);
	txAdvisor.setOrder(10);
	return txAdvisor;
}