UnexpectedRollbackException:
分析原文:http://m.blog.csdn.net/article/details?id=51214266
總結原因:
以下兩種情況同時出現(內層事務由spring設置回滾,但外層事務不回滾),則全部回滾並拋出異常:UnexpectedRollbackException:transaction rolled back because it has been marked as rollback-only
1.嵌套事務中(設置事務合並屬性propagation="REQUIRED"),里層異常事務回滾,spring會設置 isrollbackonly = true 狀態。
2.如果外層事務不設置回滾參數(如rollback-for="Exception”),則默認RuntimeException異常時外層才回滾,但是程序拋出其它異常(如ServiceException等),則外層事務不回滾。或外層處理了異常,則外層事務也不回滾。總之外層不回滾。
避免方法:外層事務設置 rollback-for="Exception”,所有異常都回滾。
備注:
propagation="REQUIRED”的含義是,支持當前已經存在的事務,如果還沒有事務,就創建一個新事務。假設調用前不存在任何事務,那么執行時會自動開啟一個事務。而由aMethod調用bMethod時,由於事務已經存在,因此會使用已經存在的事務(也就是執行aMethod之前創建的那個事務)。
