我有一个使用容器管理事务的@Stateless
EJB 。有没有办法访问“状态” javax.transaction.UserTransaction
?也就是说,UserTransaction.getStatus()
在bean方法内部调用?
我知道在容器管理的 bean 中禁止访问UserTransaction
,但我想知道,还有其他方法可以访问getStatus()
方法吗?
我有一个使用容器管理事务的@Stateless
EJB 。有没有办法访问“状态” javax.transaction.UserTransaction
?也就是说,UserTransaction.getStatus()
在bean方法内部调用?
我知道在容器管理的 bean 中禁止访问UserTransaction
,但我想知道,还有其他方法可以访问getStatus()
方法吗?
如果您只需要知道事务是否标记为回滚,则使用 EJBContext.getRollbackOnly。否则,在 JTA 1.1 中,您可以使用 TransactionSynchronizationRegistry:
TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry)
new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
int status = tsr.getTransactionStatus()
我认为你没有理解UserTransaction
班级的责任。它不存在为您提供对当前正在运行的事务的访问。它用于启动与容器的事务管理器的任何通信,尤其是用于开始和结束 bean 管理的事务;这就是为什么您不能从容器管理的事务上下文中访问它的原因。
我想知道,还有其他方法可以访问 getStatus() 方法吗?
不,不能,至少不使用 EJB API。最多可以使用 EJB 拦截器来记录已调用 EJB 方法的事实。您需要非常聪明才能跨调用跟踪状态,然后推断事务状态。
如果您不反对使用特定于容器的 API,您可能能够访问底层事务。预先警告,如果您不知道如何使用,或者如果容器禁止您这样做,下面列出的方法可能不起作用。下面描述的机制是 SpringFramework 如何访问 JTA 事务管理器并能够创建和管理事务。
在 Oracle WebLogic 的情况下,可以获取对 的引用,该引用TranactionHelper class
可用于获取与线程关联的当前事务的引用,可以获取其状态。如果您需要为其他应用程序服务器学习此课程,我会指出Spring 框架中 JTA 的 Transaction SPI 的来源。