3

我们使用 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:TransactionManagerjava:jboss/TransactionManager. 这可以防止我的事务具有事务边界,并且我会在刷新时泄漏数据。如果我从容器中删除我的配置以及 UT 和 TM,我的交易就会正常进行。

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

1 回答 1

0

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

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

使用同一个实例可以让所有东西一起工作。这也已在使用相同方法的 WebLogic 上得到证明。

于 2013-10-16T14:59:59.563 回答