2013-02-14 34 views
2

我有一個函數使用了一些在數據庫中創建一些信息的EJB Facade。這塊數據創建調用應該是原子的,如果一個失敗,則不應該提交任何內容。我如何使這塊通話事務處理?想要聲明使用幾個EJB進行事務處理的代碼塊

public myFunction() { 
    ... 
    ... 
    userFacade.create(user); 
    addressFacade.create(address); 
    orderFacade.create(order); 
    ... 
} 
+0

您可以在這裏參考http://docs.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html瞭解事務屬性。 – 2013-02-15 05:39:25

+0

準確地說,函數'myFunction'沒有返回類型,所以它不是一個函數。它當然不會加在這個問題上。 – 2013-02-15 21:56:15

回答

3

在EJB3,如果你打算使用聲明式事務(容器管理的事務),那麼你會標註這些數據與訪問調用之一:

@TransactionAttribute(TransactionAttributeType.REQUIRED) 

@TransactionAttribute(TransactionAttributeType.MANDATORY) 

這意味着這些方法將加入目前正在進行的交易如果它在那裏。 如果(myFunction)也是一個EJB方法,那麼指定REQUIRES_NEW將啓動一個新的事務。事務將在發生系統異常時回滾,但不會出現應用程序異常。這就是爲什麼你需要在這種情況下使用setRollbackOnly。

更多細節在這裏:http://docs.oracle.com/javaee/6/tutorial/doc/bncij.html

1

在Java EE,EJB是交易工作的技術,默認情況下每個業務方法是事務性的 - 與@TransactionAttribute(REQUIRED)註釋除非bean提供者改變它。

在您的情況下,將myFunction方法作爲業務方法是非常有益的,因此事務在進入方法時開始並在離開時進行提交/回滾。它將全部由EJB容器爲您處理。當引發異常時,容器將自動回滾事務並繼而回滾其間的所有操作。