2011-06-05 40 views
5

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

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

回答

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,如果您需要为其他应用程序服务器进行此课程。

10

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

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

只是为了补充,交易状态值定义在[状态类](https://docs.oracle.com/javaee/6/api/javax /transaction/Status.html)。总结: '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; ' – 2016-01-22 16:20:54