Spring 事務回滾機制

jopen 8年前發布 | 15K 次閱讀 Spring JEE框架

異常回滾示例

  1. 捕獲異常,不拋出,事物不能回滾!!!

if(userSave){          
    try {         
        userDao.save(user);          
        userCapabilityQuotaDao.save(capabilityQuota);         
     } catch (Exception e) {          
        logger.info("能力開通接口,開戶異常,異常信息:"+e);         
     }         
 }

  2.捕獲異常,拋出運行時異常,回滾。當一個方法出錯,另一個方法必然回滾

if(userSave){         
     try {          
        userDao.save(user);          
        userCapabilityQuotaDao.save(capabilityQuota);         
       } catch (Exception e) {         
        logger.info("能力開通接口,開戶異常,異常信息:"+e);          
        throw new RuntimeException();         
     }          
}

 3.捕獲異常,手動回滾

if(userSave){          
    try {          
        userDao.save(user);          
        userCapabilityQuotaDao.save(capabilityQuota);          
    } catch (Exception e) {          
        logger.info("能力開通接口,開戶異常,異常信息:"+e);          
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();         
    }         
 }

 異常事務回滾解決方案: 

 方案1.

       例如service層處理事務,那么service中的方法中不做異常捕獲,或者在catch語句中最后增加throw new RuntimeException()語句,以便讓aop捕獲異常再去回滾,并且在service上層(webservice客戶端,view層action)要繼續捕獲這個異常并處理

  方案2.

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



來自: http://my.oschina.net/manmao/blog/593886

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!