2013-10-03 41 views
2

我们使用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:TransactionManagerjava:jboss/TransactionManager提供的事务管理器。这阻止了我的交易具有交易边界,并且我泄露了有关交易的数据。如果我从容器中删除配置以及UT和TM,我的事务处理正常。

  1. 什么决定使用这个其他的TransactionManager?这似乎是来自容器的JCA,但我不明白这个决定的机制。
  2. 我是否应该删除我的UT和TM并将控制权交还给 容器,以便将这些组件提供给我的应用程序并依靠JTA 平台,或者我应该尝试获得更多控制权?
+0

'这阻止了我的交易具有交易边界,并且我泄露了有关冲洗的数据。'请详细解释此问题。很难理解它的含义。 – ben75

+0

我可以看到Hibernate认为它是在一个事务中。因此,它执行自动刷新,期望物理事务将数据保留在数据库之外。具体来说,我可以在Hibernate中调试到'ActionQueue#executeActions',并且看到数据在'executeActions(insertions);'之前没有被提交,并且之后它在数据库中。 (由不同的程序通过手动查询数据库来验证)我开始相信JBoss的JCA决定使用这个其他的TransactionManager而不是我的Spring bean版本,但我还没有完全理解这一点。 – user2832162

回答

0

容器为数据源提供来自JCA的事务管理器。这个TransactionManager是一个不同于我们从Spring连线的实例。 (我们的bean已经从arjuna环境bean实例化了)。使用Spring的JtaManager从容器中通过默认位置的JNDI获取事务管理器,以确保我们在Hibernate使用的JTA平台(本例中为JBoss App Server)中具有相同的事务管理器。

在我们进行此更改之前,应用程序TransactionManager与Hibernate处于事务中,但数据源上的transactionManager未参与导致“泄漏”。

使用相同的实例将所有内容协同工作。 WebLogic使用相同的方法也证明了这一点。

相关问题