1. 程式人生 > >SpringBoot2異常處理之用try/catch錯誤資訊並回滾事務(自動回滾/手動回滾/部分回滾)

SpringBoot2異常處理之用try/catch錯誤資訊並回滾事務(自動回滾/手動回滾/部分回滾)

問題背景

有時候,我們總是需要再SpringBoot2中對一個Service方法做一個完整的事務,發現異常時,進行回滾,然後又能返回錯誤資訊。

場景一:自動回滾(直接丟擲,不try/catch)

@Override
@Transactional(rollbackFor = Exception.class)
public Object submitOrder() throws Exception {  
     success();  
     //假如exception這個操作資料庫的方法會丟擲異常,方法success()對資料庫的操作會回滾。 
     exception(); 
     return ApiReturnUtil.success();
}

場景二:手動回滾(進行try/catch,回滾並丟擲)

@Override
@Transactional(rollbackFor = Exception.class)
public Object submitOrder (){  
    success();  
    try {  
        exception(); 
     } catch (Exception e) {  
        e.printStackTrace();     
        //手工回滾異常
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        return ApiReturnUtil.error();
     }  
    return ApiReturnUtil.success();
}

補充:回滾部分異常

  • 使用Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint(); 設定回滾點。
  • 使用TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);回滾到savePoint
@Override
@Transactional(rollbackFor = Exception.class)
public Object submitOrder (){  
    success();  
    //只回滾以下異常,
    Object savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
    try {  
        exception(); 
     } catch (Exception e) {  
        e.printStackTrace();     
        //手工回滾異常
        TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
        return ApiReturnUtil.error();
     }  
    return ApiReturnUtil.success();
}