Spring事務異常回滾,try catch 捕獲異常不回滾


例:一個方法報異常,另一個方法不會回滾

  1. try {
  2. userDao.save(user);
  3. userCapabilityQuotaDao.save(capabilityQuota);
  4. } catch (Exception e) {
  5.     }

例:一個方法報異常,另一個方法回滾

在catch語句中最后增加throw new RuntimeException()語句,以便讓aop捕獲異常再去回滾,並且在service上層(webservice客戶端,view層action)要繼續捕獲這個異常並處理

  1. try {
  2. userDao.save(user);
  3. userCapabilityQuotaDao.save(capabilityQuota);
  4. } catch (Exception e) {
  5. throw new RuntimeException();
  6. }

【現在的做法】在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動回滾,這樣上層就無需去處理異常了

  1. try {
  2. userDao.save(user);
  3. userCapabilityQuotaDao.save(capabilityQuota);
  4. } catch (Exception e) {
  5. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  6. }

 

其實像第一種try catch這種把整個包裹起來,這種業務方法也就等於脫離了spring事務的管理,因為沒有任何異常會從業務方法中拋出,全被捕獲並“吞掉”,導致spring異常拋出觸發事務回滾策略失效。

如果在catch代碼塊中采用頁面硬編碼的方式使用spring api對事務做顯式的回滾,這樣寫也是可以的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM