SpringBoot2異常處理之用try/catch錯誤資訊並回滾事務(自動回滾/手動回滾/部分回滾)
阿新 • • 發佈:2018-12-26
問題背景
有時候,我們總是需要再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(); }