事務回滾小結

1.事務回滾機制在程序中運用的非常之多,我們常用的方式就是 註解的方式 也就是在我們的service層 加上一個@Transactional這樣既可

2.但是有些時候我們並不需要所有的事件都回滾 ,這樣就需要我們自己手動回滾事務了 再次說說手動事務回      TransactionAspectSupport

3.在項目中碰到這樣的需求  供大家參考

  ResultMap resultMap1 = gradeDepartmentService.changeGradeDepsAndGrades1(memberToken, schoolUpdateReq);
        if (!resultMap1.getCode().equals(ResultMap.success().getCode()))
        {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return resultMap1;
        }

這裏既是手動回滾前面的操作。

4.原因補充

 默認spring事務只在發生未被捕獲的 runtimeExcetpion時纔回滾。  
   spring aop  異常捕獲原理:被攔截的方法需顯式拋出異常,並不能經任何處理,這樣aop代理才能捕獲到方法的異常,才能進行回滾,默認情況下aop只捕獲runtimeException的異常,但可以通過  配置來捕獲特定的異常並回滾 
    

5.

//代碼實現的方式 
if(userSave){

   try {

   userDao.save(user);

   userCapabilityQuotaDao.save(capabilityQuota);

   } catch (Exception e) {

   logger.info("能力開通接口,開戶異常,異常信息:"+e);

   throw new RuntimeException();

   }

 }

或者:

if(userSave){

   try {

   userDao.save(user);

   userCapabilityQuotaDao.save(capabilityQuota);

   } catch (Exception e) {

   logger.info("能力開通接口,開戶異常,異常信息:"+e);

   TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

   }

另外一種方式回滾到切入點

使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();  設置回滾點,使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滾到savePoint。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章