【发布时间】:2013-10-10 13:39:55
【问题描述】:
我们使用 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 平台保持不变还是我应该尝试获得更多控制权?
【问题讨论】:
-
This is preventing my transactions from having transactional boundaries and I leak data on flush.请详细解释这一点。很难理解这意味着什么。 -
我可以看到 Hibernate 认为它在一个事务中。结果,它执行自动刷新,期望物理事务将数据保留在数据库之外。具体来说,我可以在 Hibernate 中调试到
ActionQueue#executeActions并查看数据在executeActions( insertions );之前没有提交,并且之后它在数据库中。 (通过手动查询数据库的不同程序验证。我开始相信 JBoss 的 JCA 决定使用这个其他 TransactionManager 而不是我的 Spring bean 版本。我还没有完全理解这一点。
标签: java spring hibernate jboss transactions