访问容器托管bean中的事务状态

时间:2011-06-05 03:49:43

标签: java-ee ejb jta distributed-transactions

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

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

2 个答案:

答案 0 :(得分:12)

如果您只需要知道事务是否标记为回滚,那么请使用EJBContext.getRollbackOnly。否则,使用JTA 1.1,您可以使用TransactionSynchronizationRegistry:

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

答案 1 :(得分:2)

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

  

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

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

如果您不反对使用特定于Container的API,则可能能够访问基础事务。 预先警告,如果您不知道如何使用它,或者容器禁止您这样做,下面列出的方法可能无效 。下面描述的机制是SpringFramework如何获得对JTA事务管理器的访问权限,并且能够创建和管理事务。

对于Oracle WebLogic,可以获得对TranactionHelper class的引用,该引用可用于获取与线程关联的current transaction的引用,其status可以获得。如果你需要为其他应用服务器开设这门课程,我会指向sources of the Transaction SPI for JTA in the Spring framework