【问题标题】:Accessing transaction status in container managed beans访问容器管理的 bean 中的事务状态
【发布时间】:2011-06-05 03:49:42
【问题描述】:

我有一个@Stateless EJB 使用容器管理事务。有没有办法访问javax.transaction.UserTransaction 的“状态”?也就是在bean方法里面调用UserTransaction.getStatus()

我知道在容器管理的 bean 中禁止访问 UserTransaction,但我想知道,有没有其他方法可以访问 getStatus() 方法?

【问题讨论】:

    标签: jakarta-ee ejb jta distributed-transactions


    【解决方案1】:

    如果您只需要知道事务是否标记为回滚,则使用 E​​JBContext.getRollbackOnly。否则,对于 JTA 1.1,您可以使用 TransactionSynchronizationRegistry:

    TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry)
      new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
    int status = tsr.getTransactionStatus()
    

    【讨论】:

    • 作为补充,事务状态值在the Status class 中定义。总结一下:STATUS_ACTIVE = 0; STATUS_MARKED_ROLLBACK = 1; STATUS_PREPARED = 2; STATUS_COMMITTED = 3; STATUS_ROLLEDBACK = 4; STATUS_UNKNOWN = 5; STATUS_NO_TRANSACTION = 6; STATUS_PREPARING = 7; STATUS_COMMITTING = 8; STATUS_ROLLING_BACK = 9;
    【解决方案2】:

    我认为你没有理解 UserTransaction 类的责任。它不存在为您提供对当前正在运行的事务的访问。它用于启动与容器的事务管理器的任何通信,尤其是用于开始和结束 bean 管理的事务;这就是为什么您不能从容器管理的事务上下文中访问它的原因。

    我想知道,有没有其他方法可以访问 getStatus() 方法?

    不,不能,至少不使用 EJB API。最多可以使用 EJB 拦截器来记录已调用 EJB 方法的事实。您需要非常聪明才能跨调用跟踪状态,然后推断事务状态。

    如果您不反对使用特定于容器的 API,您也许可以访问底层事务。 请注意,如果您不知道如何使用,或者如果容器禁止您这样做,下面列出的方法可能不起作用。下面描述的机制是 SpringFramework 如何访问 JTA 事务管理器并能够创建和管理事务。

    在Oracle WebLogic的情况下,可以获得对TranactionHelper class的引用,该引用可用于获得与线程关联的current transaction的引用,其status可以获得。如果您需要为其他应用程序服务器学习此课程,我会指向sources of the Transaction SPI for JTA in the Spring framework

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2015-06-23
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多