【问题标题】:TransactionManager from Spring or JNDI? (JBOSS + Spring 3 + Hibernate 4 + JTA)来自 Spring 或 JNDI 的 TransactionManager? (JBOSS + Spring 3 + Hibernate 4 + JTA)
【发布时间】: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:TransactionManagerjava:jboss/TransactionManager 提供的事务管理器。这可以防止我的事务具有事务边界,并且我会在刷新时泄漏数据。如果我从容器中删除我的配置以及 UT 和 TM,我的交易就会正常进行。

  1. 是什么决定使用这个其他 TransactionManager?这似乎是容器中的 JCA,但我不明白这个决定的机制。
  2. 我是否应该移除我的 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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2014-10-26
    相关资源
    最近更新 更多