2010-11-07 19 views
16

我有bean管理的事務無狀態Bean和方法是這樣的:UserTransaction如何傳播?

@Stateless 
@TransactionManagement(TransactionManagementType.BEAN) 
public class ... { 

    @Resource 
    private UserTransaction ut; 
    @EJB 
    private OtherStatelessBeanLocal other; 

    public void invokeSomeMethods() 
     ut.begin(); 
     ... 

     // invoke other bean's methods here. 
     other.method(); 

     ... 
     ut.commit(); 

    } 

} 

那麼如何UserTransaction傳播到OtherStatelessBeanLocal豆?

+0

好它沒有,對吧? – 2014-11-11 22:32:17

回答

32

UserTransaction對象是由容器提供的對象,它包裝對容器在內部使用的API調用的訪問,特別是javax.transaction.TransactionManager。該TransactionManager有像begincommitrollbackjavax.transaction.Transaction getTransaction()

在幕後的方法,該事務管理器將使用ThreadLocal或類似的技術與線程跟蹤當前交易狀態。 ThreadLocals是非常簡單的對象,可以很容易地描述爲static HashMap,它使用線程名稱作爲鍵和您選擇的對象作爲值。只要您保持在同一個線程中,就可以從調用鏈中的任意位置獲取對象。這是不允許在Java EE環境中啓動線程的原因之一。

安全傳播以類似的方式工作,就像JNDI查找神奇地指向正確的模塊或組件的java:comp/env名稱空間一樣。底線是你不能實現沒有ThreadLocals的應用服務器。傳播聽起來比現在更加活躍,事實上,這只是一種不離開線程的行爲,因此容器和所有相關人員仍然可以找到您的「材料」。

回到事務管理術語來說,TransactionManager將在其ThreadLocal中跟蹤的對象通常會(直接或間接)實現接口TransactionTransactionSynchronizationRegistry。在這兩個界面之間,該容器擁有所有必要的掛鉤以代表您在當前交易中跟蹤DataSource s,EntityManager和其他資源。這些接口還允許容器提供回調,例如SessionSynchronization,以及在交易完成後代表您執行其他事情的方式,例如刷新/關閉EntityManagers,發送JMS待處理消息以及在應用程序中持久保存由您的應用創建的任何計時器的交易。

+2

完美答案。+1 – 2010-11-10 02:40:02

+0

其實不是,因爲它不會將知識應用於問題。 – Thomas 2017-11-03 07:26:19

0

對於EJB3,您通常使用@TransactionAttribute註釋來定義事務傳播。

所有EJB 3.0應用程序的默認的事務屬性是必需的:

如果一個客戶端調用企業Bean的方法,同時在客戶端與事務上下文關聯,容器調用企業Bean的方法在客戶端的事務上下文。

的交易類型的文檔的當前位置:http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

注:持久性上下文和事務傳播通常會一起發生,但並非總是如此 - 要小心。例如,有狀態會話bean可能有一個extended persistence context

+0

注意,在EXTENDED持久化上下文的情況下,持久化上下文仍然只與事務相關聯,並且不可用於其他事務,因爲只要持有@Stateful bean參與事務,就不允許離開事務直到它提交或回滾。從事務外的所有對@Stateful bean的請求都會等待@AccessTimeout的持續時間,然後才拋出某種形式的ConcurrentAccessException。 – 2010-11-10 03:53:09

4

基於EJB規範中,則可以使用編程式的事務到另一個bean(在這種情況下,其他)使用程序交易沒有通過從一個bean事務上下文(在這種情況下,你的主類...)