spring事務,service中捕獲異常不丟擲,不回滾
阿新 • • 發佈:2019-01-21
參考文章:http://blog.csdn.net/yipanbo/article/details/46048413
spring事務機制:
預設spring事務只在發生未被捕獲的RuntimeException時才回滾。
spring aop異常捕獲原理:被攔截的方法需要顯式丟擲異常,不能經過處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾。預設情況下aop只捕獲RuntimeException的異常,但可以通過配置來捕獲特定的異常並回滾。換句話說,在service的方法中不使用try-catch或者在catch中最後加上throw new RuntimeException(),這樣程式發生異常時才能被aop捕獲進而回滾。
解決方案:
1)例如Service層處理事務,那麼Service中的方法中不做異常捕獲,或者在catch語句中最後增加throw new RuntimeException()語句,以便aop捕獲異常再去回滾,並且在service上層要繼續捕獲這個異常並處理。
2)在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常。