我们使用 Spring 和 Hibernate 来建立与 JTA 的事务。PlatformTransactionManager 是 JtaTransactionManager,它与来自 narayana 的 TransactionManager 和 UserTransaction 相连。
@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。这似乎是 JBoss 通过 JNDI 名称java:TransactionManager
和java:jboss/TransactionManager
. 这可以防止我的事务具有事务边界,并且我会在刷新时泄漏数据。如果我从容器中删除我的配置以及 UT 和 TM,我的交易就会正常进行。
- 是什么决定使用这个其他 TransactionManager?这似乎是容器中的 JCA,但我不明白这个决定的机制。
- 我应该删除我的 UT 和 TM 并将控制权交给容器以将这些组件提供给我的应用程序并按原样依赖 JTA 平台,还是应该尝试获得更多控制权?