2011-06-05 82 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