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

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

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

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

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

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

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

  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對事務作顯式的回滾,這樣寫也是能夠的。spa

相關文章
相關標籤/搜索