我有一個@Stateless
EJB使用容器管理的事務。有沒有辦法訪問javax.transaction.UserTransaction
的「狀態」?也就是說,在bean方法裏面調用UserTransaction.getStatus()
?訪問容器管理的事務中的事務狀態
我知道訪問UserTransaction
被禁止在容器管理的bean中,但是我想知道,有沒有其他方法可以訪問getStatus()
方法?
我有一個@Stateless
EJB使用容器管理的事務。有沒有辦法訪問javax.transaction.UserTransaction
的「狀態」?也就是說,在bean方法裏面調用UserTransaction.getStatus()
?訪問容器管理的事務中的事務狀態
我知道訪問UserTransaction
被禁止在容器管理的bean中,但是我想知道,有沒有其他方法可以訪問getStatus()
方法?
我不認爲你已經理解了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,如果您需要爲其他應用程序服務器進行此課程。
如果您只需要知道事務是否標記爲回滾,則使用EJBContext.getRollbackOnly。否則,JTA 1.1,你可以使用TransactionSynchronizationRegistry:
TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry)
new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
int status = tsr.getTransactionStatus()
只是爲了補充,交易狀態值定義在[狀態類](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