2012-02-10 33 views
3

我想下面的堆棧跟蹤爲Java調用:Java的春天:瞭解@Transactional的rollbackFor和事務劃分

B.method2 (annotated with a plain @Transactional) 
A.method1 (annotated with a plain @Transactional) 
Main.main (starting point of the call, with no current transaction) 

我希望進入A.method1當交易開始 - 和事務將被COMMITED(或退回)A.method1離開時。我也期待在B.method2中使用相同的事務。

RuntimeException從B.method2中拋出。這是默認情況下爲rollbackFor'列出'的異常。異常在A.method1中被捕獲,但是當離開B.method2時它會通過@Transactional的邊界。

這是我的問題:將(當前)事務標記爲回滾?

+0

嘗試它會不會更快,而不是等待別人回答? – skaffman 2012-02-10 09:55:02

+0

實際沒有 - 因爲您可以使用許多不同的設置(AOP,AspectJ,加載時間/代理編織...)來配置Spring。這是對@Transactional概念的一個問題。 – aanno 2012-02-10 12:03:03

回答

0

默認傳播模式爲REQUIRED,method2將使用爲method1啓動的事務。在例外情況下,此事務將被標記爲回滾,因此不會向數據庫提交任何內容。方法1後可能會得到UnexpectedRollbackException

這不是一個想要的行爲,因爲啓動事務(擁有它)的代碼應該控制回滾/提交。我會重新組織你的代碼以避免這種可能性。

+0

是的,這是我嘗試它時得到的結果,也是我閱讀Spring源代碼時看到的結果。但恕我直言,這感覺很奇怪。實際上,我所期望的是,只有當異常「跨越」了交易限制時,交易才被標記爲回滾。在我的例子中情況並非如此(因爲事務以A.method1開始和結束) - 因此我期望事務不會被標記爲回滾。 – aanno 2012-02-10 12:04:59

+0

順便說一句,這是否符合JEE 6中的聲明式交易管理? – aanno 2012-02-10 12:11:03

+0

@aanno然後你的問題是什麼?在描述的場景中只有一個事務。如果標記爲回滾,則會回滾。我沒有使用JPA,你可能想問另一個問題。 – mrembisz 2012-02-10 12:11:47