【问题标题】:Programming BMT - UserTransaction编程 BMT - UserTransaction
【发布时间】:2012-01-02 12:09:02
【问题描述】:

BMT的完整编程是基于UserTransaction接口吗?换句话说,如果我想使用 BMT,是否存在需要比 UserTransaction 接口提供的服务更多的服务的情况。

为什么要问这个问题?如果我使用不同的事务管理器实现(例如 Bitronix TM 或 Atomikos)而不是容器提供的默认值,那么将新的 TM 注入 UserTransaction 对象就足够了吗?

-谢谢

【问题讨论】:

    标签: ejb-3.0 ejb-3.1 atomikos


    【解决方案1】:

    这实际上仅限于应用服务器本身所允许的;即,如果它明确支持替换事务管理器。

    事务管理的真正艺术是容器向 TransactionManager 注册事务资源(DataSource 连接、JMS 会话、JPA EntityManager 等),方法是使用 Synchronization 对象包装它们并通过 @987654322 将它们注册到当前事务中@ 或TransactionSynchronizationRegistry

    容器实现Synchronization对象,TransactionManager实现TransactionTransactionSynchronizationRegistry对象。两者之间的协调是在事务运行时为您提供实际管理的原因。

    BMT 和 CMT 只是告诉容器启动/停止事务的替代方法。在某些方面,术语“Bean-Managed”是错误的,因为每个兼容的应用程序服务器中的 UserTransaction 都将由容器实现,因此它仍然是容器在工作。 “容器管理”也有点误导,因为它仍然是 bean 开发人员决定何时启动/停止事务,它只是以声明方式与编程方式完成。对这些特性最准确的描述是程序化管理事务和声明式管理事务。在所有情况下,它仍然是 bean 与容器对话,容器和事务管理器完成所有工作。

    尽管如此,您仍然可以更改事务管理器,OpenEJB 和 TomEE 支持它,但它不会以您尝试的方式工作。请咨询您的供应商,看看这是否可行。

    【讨论】:

    • 感谢您的回复。您能否详细解释一下“但是它不会以您尝试的方式工作。” 就我而言,我没有更换容器中的 TM,但我只是使用第 3 方 TM在不涉及容器的单元测试阶段。我只是想知道是否可以完全使用UserTransaction接口的服务来实现BMT,或者我们是否需要一些其他服务来应对特殊场景? (例如,Dexter 解释说可以在资源本地 TM 中使用没有 UserTransaction 的 BMT)。
    【解决方案2】:

    也许不能完全回答您的问题,但如果使用 BMT,您也可以使用资源本地事务管理器。在这种情况下,您不会使用(注入的)UserTransaction 接口。

    请注意,只有在没有通过上述 UserTransaction 接口启动的事务正在进行时,这才是合法的。

    【讨论】:

    • 感谢您的回答。你能用一个简单的例子来说明它吗?你的意思是说使用资源本地TM时不需要UserTransaction?如果我没记错的话,我想在这种情况下可以使用 UserTransaction,尽管我们不会使用符合 JTA 的事务。如果我错了,请纠正我。
    • UserTransaction 是符合 JTA 的,如果我没记错的话。可以肯定的是,资源本地 TM 只是类似于 JDBC 连接上的connection.setAutocommit(false)
    猜你喜欢
    • 2012-02-29
    • 2013-07-27
    • 2011-04-18
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2016-09-03
    相关资源
    最近更新 更多