2016-10-26 50 views
0

最近重構了一些代碼,遇到了一個EJB bean調用另一個的事務回滾場景。現在在異常塊中,每個bean都有其標記爲回滾的上下文。跨多個EJB的事務

這是一個很好的做法,或者他們應該重新拋出異常&最後,啓動器bean只會執行回滾。另外,如果跨EJB的跨單個事務,那麼回滾應該發生在原始bean或者它遇到異常的地方。

用於XA數據源持久性的事務類型JTA。

回答

1

有了這個

被標記爲回滾

你的意思是,EJB捕獲異常,並使用setRollbackOnly

如果是這種情況,那麼它取決於您的設計,以決定哪種方法是首選。

通常情況下,如果容器檢測到系統異常,則會回滾事務。相反的應用例外沒有這種效果。但是,如果您的業務邏輯要求即使業務異常具有重要影響,以致它必須具有回滾整個交易的效果,那麼您可以選擇setRollBackOnly,或者使用rollback=true啓動應用程序例外。

第二種方法也具有不破壞bean的效果。

關於你提到的第二個問題:

而且,如果有跨EJB的單筆交易跨越,那麼 回滾應在發端豆發生,或者在那裏遇到 例外。

回滾由容器管理,同樣取決於您的設計。請記住,這個錯誤可能會通過你的獨特bean的漏洞負責回滾事務,並且根本沒有被捕獲。所以你最終會遇到一個不想要的場景,一個事務不會被回滾。

+0

+1是的,這是非常具體的設計。但是由於一些複雜的情況,不要在兩者之間的地方放鬆東西。另外,其他一些bean可能會在未來的流程中添加,然後他們必須跟蹤前後交易發生的情況;因此認爲每個bean都應該獨立管理而不受外部依賴。這更像是一個需要遵循的設計問題和實踐。 –

+0

我經常看到的另一種非常常見的方法是在bean級別捕獲異常並重新拋出EJBException或擴展EJBException的自定義異常。這樣,您仍然可以記錄出錯的地方,並獲得容器回滾事務的好處。 – Leonardo