我使用容器管理的事务@Stateless
EJB。有没有办法访问javax.transaction.UserTransaction
的“状态”?也就是说,在bean方法中调用UserTransaction.getStatus()
?
我知道在容器管理的bean中禁止访问UserTransaction
,但我想知道,有没有其他方法可以访问getStatus()
方法?
答案 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。