Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Spring】@TransactionalでTransactionManagerを明示的に指定する

f:id:rennnosukesann:20181220183020p:plain

メモ。

TL;DR

Spring で使用する@Transactionには、下記のように使用する Manager を明示できます。

@Transactional("jpaTransactionManager")

複数のTransactionManagerの定義と@Transaction

Springにおける@Transactionは、デフォルトで用意されている一意のTransactionManagerを参照しています。

しかし、下記のように新たにTransactionManagerを@Configurationクラス内で定義したりすると、

protected PlatformTransactionManager getTransactionManager() {
  return transactionConfig.getJpaTransactionManager();
}

@TransactionはどのTransactionManagerを参照していいのかわからず、下記のようなエラーを吐いてしまいます。

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available: expected single matching bean but found 2: transactionManager,getJpaTransactionManager

@Transactionが使用するManagerを明示的に指定するには、@Transactionの引数にTransactionManagerの名称を渡します。@Transactionは指定したTransactionManagerに従い、Transaction管理を実行します。

@Transactional("jpaTransactionManager")