7

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

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

4

2 回答 2

15

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

TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry)
  new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
int status = tsr.getTransactionStatus()
于 2011-06-07T01:06:49.017 回答
2

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

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

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

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

在 Oracle WebLogic 的情况下,可以获取对 的引用,该引用TranactionHelper class可用于获取与线程关联的当前事务的引用,可以获取其状态。如果您需要为其他应用程序服务器学习此课程,我会指出Spring 框架中 JTA 的 Transaction SPI 的来源。

于 2011-06-05T07:11:29.467 回答