- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个遗留应用程序。我们将其从 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/
我正在开发一个遗留应用程序。我们将其从 JDBC 迁移到带有声明性事务的 Spring 3.2 + Hibernate 4.1.12 + JTA 2。我看到容器管理事务 (CMT) 正在按预期进行事务
环境:Java EE 6 如何在Interceptor中判断调用的bean是容器管理的(CMT)还是bean管理的(BMT)? 最佳答案 根据定义,Bean 始终由容器管理。 您可能想知道当前事务是
出于好奇,是否可以从 Web 容器直接控制 EJB 事务? 为了说明这一点,我制作了这个简单的示例,在 Web 容器中启动 UserTransaction(使用 Servlet),但事务未绑定(bin
如何管理 CMT 和 BMT? 根据我的理解,容器管理事务是通过 JTA 实现的,它由应用程序服务器支持,而不是像 tomcat 这样的网络服务器。 CMT 由事务管理器实现处理,它特定于每个应用程序
该主题的各种部分描述使我怀疑 BMT 与应用程序管理的 EntityManager(以及 UserTransaction 的使用)密切相关,而 CMT 与容器管理的 EntityManager 密切相
我当前在刷新 PersistenceContext 中的数据时遇到问题。我有一个 CMT EJB3 bean,它调用 BMT EJB3 bean。在 BMT bean 中,我对对象执行一些处理逻辑。我
我们有一个简单的无状态 EJB 计时器,它可以将 spring 服务的实例注入(inject)其中。 spring 服务有一个标记为事务性的方法。当 EJB 使用事务管理类型 CONTAINER 时,
我是一名优秀的程序员,十分优秀!