Spring と Hibernate を使用して、JTA とのトランザクションを確立しています。PlatformTransactionManager は、narayana の TransactionManager および UserTransaction と結び付けられた JtaTransactionManager です。
@Bean
@Scope("prototype")
public TransactionManager jbossTransactionManager() {
return jtaPropertyManager.getJTAEnvironmentBean().getTransactionManager();
}
@Bean
@Scope("prototype")
public UserTransaction jbossUserTransaction() {
return jtaPropertyManager.getJTAEnvironmentBean().getUserTransaction();
}
@Bean
public PlatformTransactionManager transactionManager() {
return new JtaTransactionManager(jbossUserTransaction(), jbossTransactionManager());
}
JtaTransactionManager には、必要な UT と TM があることに注意してください。JBoss 6 EAP では、DataSource が WrapperDataSource として使用されており、これが別の TM に関連していることに気付きました。具体的には、TransactionManagerDelegate を使用しています。これは、JNDI 名java:TransactionManager
およびjava:jboss/TransactionManager
. これにより、トランザクションがトランザクション境界を持つことができなくなり、フラッシュ時にデータがリークします。コンテナーから構成と UT および TM を削除すると、トランザクションは適切に処理されます。
- この他の TransactionManager を使用する決定は何ですか? これはコンテナーからの JCA のようですが、この決定のメカニズムがわかりません。
- UT と TM を削除し、コンテナーにコントロールを明け渡して、これらのコンポーネントをアプリに提供し、そのまま JTA プラットフォームに依存する必要がありますか?