gpt4 book ai didi

java - 结合 CMT 和 BMT 的事务管理(BMT 情况下数据提前提交)

转载 作者:太空宇宙 更新时间:2023-11-04 07:22:28 27 4
gpt4 key购买 nike

我正在开发一个遗留应用程序。我们将其从 JDBC 迁移到带有声明性事务的 Spring 3.2 + Hibernate 4.1.12 + JTA 2。我看到容器管理事务 (CMT) 正在按预期进行事务和回滚。我们使用 Infinispan 作为二级缓存 (2LC)。有一条皱纹...

有一部分代码具有不同的入口点,该入口点在不同的线程中运行并使用编程事务或 Bean 管理事务 (BMT)。在 BMT 路径中,我看到在使用 CMT 的底层服务层中,事务正在与 BMT 结合,正如人们所希望和期望的那样。

两个入口点的持久性单元、数据源等相同。在这两种情况下,Hibernate 自动刷新代码都会意识到存在事务并刷新到数据库驱动程序。在 CMT 入口点,数据库驱动程序保存数据,直到被告知提交或回滚。在 BMT 路径中,数据在刷新时被推送到数据库中 - 稍后的提交或回滚没有任何效果或明显的意义。事务管理器是JtaTransactionManager。 JtaTransactionManager 在 @Configuration 类中定义,并使用 @EnableTransactionManagement 来启用 CMT 而不是 <tx:annotation-driven/>元素。

单例 JtaTransactionManager bean 通过 jtaPropertyManager.getJTAEnvironmentBean().getTransactionManager() 与 ajuna UserTransaction 和 TransactionManager 连接。和jtaPropertyManager.getJTAEnvironmentBean().getUserTransaction() 。 UserTransaction 和 TransactionManager 都是原型(prototype) @Bean 定义。

我可以通过另一个查询工具的查询来确认数据是否在数据库中,以在调试时验证行为。

当我进行单元测试时,数据会按 BMT 和 CMT 入口点的预期提交和回滚。

BMT 由一个类管理,该类以不同的方法开始和结束事务。它还具有执行实际工作单元的方法。 BMT 的事务是通过 PlatformTransactionManager 而不是 TransactionTemplate 启动的。该类由另一个具有管理逻辑流的逻辑的类驱动。我知道交易正在按预期开始和结束。在阅读各种其他讨论时,似乎暗示事务控制应该在单个方法内。我同意这是首选,但这是必要的吗?

如果 Spring 中的 CMT 管理的 servlet 生成一个新线程并使用计划 thread.start() 启动该线程,那么期望该新线程中的 BMT 能够按照上述方式管理其事务是否合理?

数据源由 JNDI 检索。使用 XA 或非 XA 不会影响结果。

我无法发布代码。

As a reference, here is the link to the Spring 3.1 docs on transaction in chapter 11.

添加于 2013/10/04 - 我看到 Spring 使用 JtaTransactionManagerBeanDefinitionParser构建所需的JtaTransactionManager基于感知的容器。使用此功能时,JTA 事务管理器将在 afterPropertiesSet 中将其自身设置为UserTransaction、TransactionManager 和 TransactionSynchronizationRegistry。

看来我实际上仍然在 CMT 中泄漏数据,但如果没有调试器或不自然地强制错误,则很难感知/观察到这一点,因为事务通常会提交。

我的问题似乎是我部分绕过了 JCA,以致 JCA 使用了不同的 TransactionManager。

部分答案 - 因为我已经在 CMT 和 BMT 的混合中看到此交易正确,所以我知道 BMT 交易可以以一种方法启动并以另一种方法提交。

问题仍然存在:如果 Spring 中的 CMT 管理的 servlet 生成一个新线程并使用计划 thread.start() 启动该线程,那么期望该新线程中的 BMT 能够按照上述方式管理其事务是否合理?

最佳答案

从 JTA 1.1 规范 ( http://download.oracle.com/otn-pub/jcp/jta-1.1-spec-oth-JSpec/jta-1_1-spec.pdf ) 第 3.1 节中可以清楚地看出,事务是绑定(bind)到线程的。这是由 TransactionManager 管理的。如果线程是创建事务的线程,则应该能够期望该线程能够在事务上下文中执行操作。

请注意,嵌套事务的支持是可选的,如 JTA 规范的同一部分中所引用的那样。

我遇到的实际问题是托管数据源使用的事务管理器实例与我们在应用程序中作为 bean 的实例不同。更改应用程序代码以对容器提供的 TransactionManager 进行 JNDI 查找,从而允许托管数据源参与与应用程序相同的事务。

关于java - 结合 CMT 和 BMT 的事务管理(BMT 情况下数据提前提交),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19100561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com