我们使用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上,我注意到我的数据源已被用作WrapperDataSource,并且这与另一个TM有关。具体来说,它使用的是TransactionManagerDelegate。这似乎是JBoss通过JNDI名称java:TransactionManagerjava:jboss/TransactionManager提供的事务管理器。这将阻止我的事务具有事务边界,并且在刷新时会泄漏数据。如果我从容器中删除配置以及UT和TM,则我的交易会正常进行。


是什么决定使用另一个TransactionManager?这似乎是来自容器的JCA,但我不了解此决定的机制。
我应该删除UT和TM并将控制权交还给
容器将这些组件提供给我的应用程序并依靠JTA
平台还是应该尝试获得更多控制权?

最佳答案

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

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

使用同一个实例可以使所有事情协同工作。在WebLogic上也使用相同的方法证明了这一点。

关于java - 是Spring还是JNDI的TransactionManager? (JBOSS + Spring 3 + hibernate 4 + JTA),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19166272/

10-13 01:12