spring在service層的方法報錯事務不會回滾的解決
spring在service層方法報錯事務不會回滾
@Transactional(rollbackFor = {Exception.class}) public void insertData() throws Exception { ?? ?// 業(yè)務代碼1 ?? ?business1(); ?? ? ?? ?// 業(yè)務代碼2 ?? ?business2(); ?? ? ?? ?// 業(yè)務代碼3 ?? ?business3(); } ? public void business1() { ?? ?// 此處省略業(yè)務操作 } ? public void business2() { ?? ?// 此處省略業(yè)務操作 } ? public void business3() { ?? ?// 此處省略業(yè)務操作 }
以上代碼在service層執(zhí)行insertData方法時,business3中的代碼執(zhí)行出錯了,business1和business2中的操作都沒有回滾
解決方法
方法一:在service方法中捕獲異常,同時向外拋出運行時異常
@Transactional(rollbackFor = {Exception.class}) public void insertData() throws Exception { ?? ?try { ?? ??? ?// 業(yè)務代碼1 ?? ??? ?business1(); ?? ??? ? ?? ??? ?// 業(yè)務代碼2 ?? ??? ?business2(); ?? ??? ? ?? ??? ?// 業(yè)務代碼3 ?? ??? ?business3(); ?? ?} catch(Exception e) { ?? ??? ?throw new RuntimeException(e); ?? ?} }
方法二:在service方法中捕獲異常,同時手動回滾事務
service手動回滾問題
如果對spring配置了service層事物的管理。
在一些業(yè)務中需要回滾,正常來說拋出一個運行時異常即可
throw new RuntimeException();
只是這樣的話代碼就結束了,如果要返回給用戶錯誤信息,不太方便,這時可以添加如下代碼,在catch中手動回滾
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
這樣既能正常返回錯誤信息,而又保持了事物的原子性。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot post接口接受json時,轉換為對象時,屬性都為null的解決
這篇文章主要介紹了springboot post接口接受json時,轉換為對象時,屬性都為null的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10MyBatisPlus 查詢selectOne方法實現(xiàn)
本文主要介紹了MyBatisPlus 查詢selectOne方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01Java零基礎教程之Windows下安裝、啟動Tomcat服務器方法圖解(免安裝版)
這篇文章主要介紹了Windows系統(tǒng)下安裝、啟動、注冊服務、停止 Tomcat操作的所有方法,本文通過圖文并茂的方式給大家介紹的非常詳細,感興趣的朋友一起看看吧2016-09-09多線程Thread,Runnable,Callable實現(xiàn)方式
這篇文章主要為大家詳細介紹了Java多線程如何實現(xiàn)Thread,Runnable,Callable的方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08