我们使用Spring与Hibernate建立与JTA的事务。 PlatformTransactionManager是与来自narayana的TransactionManager和UserTransaction连接的JtaTransactionManager。来自Spring或JNDI的TransactionManager? (JBOSS + Spring 3 + Hibernate 4 + JTA)
@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 平台,或者我应该尝试获得更多控制权?
'这阻止了我的交易具有交易边界,并且我泄露了有关冲洗的数据。'请详细解释此问题。很难理解它的含义。 – ben75
我可以看到Hibernate认为它是在一个事务中。因此,它执行自动刷新,期望物理事务将数据保留在数据库之外。具体来说,我可以在Hibernate中调试到'ActionQueue#executeActions',并且看到数据在'executeActions(insertions);'之前没有被提交,并且之后它在数据库中。 (由不同的程序通过手动查询数据库来验证)我开始相信JBoss的JCA决定使用这个其他的TransactionManager而不是我的Spring bean版本,但我还没有完全理解这一点。 – user2832162