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