**#service中涉及了數(shù)據(jù)庫操作括改,出現(xiàn)異常不會回滾數(shù)據(jù)庫的問題**
service中涉及了數(shù)據(jù)庫操作腻豌,出現(xiàn)了異常不會回滾,因為默認spring事務(wù)只在發(fā)生未被捕獲的 runtimeexcetpion時或者unchecked exceptions才回滾嘱能。
現(xiàn)在說一下pring aop 異常捕獲原理:被攔截的方法需顯式拋出異常吝梅,并不能經(jīng)任何處理,這樣aop代理才能捕獲到方法的異常惹骂,才能進行回滾苏携,默認情況下aop只捕獲runtimeexception的異常,但可以通過配置來捕獲特定的異常并回滾对粪,換句話說在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion()右冻,這樣程序異常時才能被aop捕獲進而回滾装蓬。
解決方案:
方案1.例如service層處理事務(wù),那么service中的方法中不做異常捕獲纱扭,或者在catch語句中最后增加throw new RuntimeException()語句牍帚,以便讓aop捕獲異常再去回滾,并且在controller層要繼續(xù)捕獲這個異常并處理
方案2.在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句乳蛾,手動回滾暗赶,這樣上層就無需去處理異常(現(xiàn)在項目的做法)
方案3.使用springmvc的,加入@Transactional(rollbackFor = { Exception.class })這個注解肃叶,就會在Exception時進行事務(wù)回滾蹂随。
注意:使用方案1如果使用throw new Exception()方法是不會回滾事務(wù)的,只有RuntimeException才會進行回滾