spring在service層的方法報錯事務不會回滾的解決
spring在service層方法報錯事務不會回滾
@Transactional(rollbackFor = {Exception.class}) public void insertData() throws Exception { // 業務代碼1 business1(); // 業務代碼2 business2(); // 業務代碼3 business3(); } public void business1() { // 此處省略業務操作 } public void business2() { // 此處省略業務操作 } public void business3() { // 此處省略業務操作 }
以上代碼在service層執行insertData方法時,business3中的代碼執行出錯瞭,business1和business2中的操作都沒有回滾
解決方法
方法一:在service方法中捕獲異常,同時向外拋出運行時異常
@Transactional(rollbackFor = {Exception.class}) public void insertData() throws Exception { try { // 業務代碼1 business1(); // 業務代碼2 business2(); // 業務代碼3 business3(); } catch(Exception e) { throw new RuntimeException(e); } }
方法二:在service方法中捕獲異常,同時手動回滾事務
service手動回滾問題
如果對spring配置瞭service層事物的管理。
在一些業務中需要回滾,正常來說拋出一個運行時異常即可
throw new RuntimeException();
隻是這樣的話代碼就結束瞭,如果要返回給用戶錯誤信息,不太方便,這時可以添加如下代碼,在catch中手動回滾
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
這樣既能正常返回錯誤信息,而又保持瞭事物的原子性。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 關於controller的異常處理及service層的事務控制方式
- 解決try-catch捕獲異常信息後Spring事務失效的問題
- springBoot service層事務控制的操作
- spring 中事務註解@Transactional與trycatch的使用
- Java @Transactional指定回滾條件