service中涉及了數(shù)據(jù)庫(kù)操作,出現(xiàn)異常不會(huì)回滾數(shù)據(jù)庫(kù)的問(wèn)題

**#service中涉及了數(shù)據(jù)庫(kù)操作,出現(xiàn)異常不會(huì)回滾數(shù)據(jù)庫(kù)的問(wèn)題**
service中涉及了數(shù)據(jù)庫(kù)操作,出現(xiàn)了異常不會(huì)回滾,因?yàn)槟J(rèn)spring事務(wù)只在發(fā)生未被捕獲的 runtimeexcetpion時(shí)或者unchecked exceptions才回滾。
現(xiàn)在說(shuō)一下pring aop  異常捕獲原理:被攔截的方法需顯式拋出異常,并不能經(jīng)任何處理,這樣aop代理才能捕獲到方法的異常,才能進(jìn)行回滾,默認(rèn)情況下aop只捕獲runtimeexception的異常,但可以通過(guò)配置來(lái)捕獲特定的異常并回滾,換句話說(shuō)在service的方法中不使用try catch 或者在catch中最后加上throw new runtimeexcetpion(),這樣程序異常時(shí)才能被aop捕獲進(jìn)而回滾。
解決方案:

方案1.例如service層處理事務(wù),那么service中的方法中不做異常捕獲,或者在catch語(yǔ)句中最后增加throw new RuntimeException()語(yǔ)句,以便讓aop捕獲異常再去回滾,并且在controller層要繼續(xù)捕獲這個(gè)異常并處理
方案2.在service層方法的catch語(yǔ)句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語(yǔ)句,手動(dòng)回滾,這樣上層就無(wú)需去處理異常(現(xiàn)在項(xiàng)目的做法)
方案3.使用springmvc的,加入@Transactional(rollbackFor = { Exception.class })這個(gè)注解,就會(huì)在Exception時(shí)進(jìn)行事務(wù)回滾。

注意:使用方案1如果使用throw new Exception()方法是不會(huì)回滾事務(wù)的,只有RuntimeException才會(huì)進(jìn)行回滾

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • java事務(wù)的處理 轉(zhuǎn) https://www.cnblogs.com/Bonker/p/5417967.html...
    小小的Jobs閱讀 1,629評(píng)論 0 1
  • JS之Promise(2) Promise 的狀態(tài)實(shí)例化的 Promise 有三個(gè)狀態(tài):Fulfilled: ha...
    悠悠前端仔閱讀 247評(píng)論 0 1
  • 八、深入理解java異常處理機(jī)制 引子try…catch…finally恐怕是大家再熟悉不過(guò)的語(yǔ)句了, 你的答案是...
    壹點(diǎn)零閱讀 1,730評(píng)論 0 0
  • 1.8 違例控制:解決錯(cuò)誤 從最古老的程序設(shè)計(jì)語(yǔ)言開(kāi)始,錯(cuò)誤控制一直都是設(shè)計(jì)者們需要解決的一個(gè)大問(wèn)題。由于很難設(shè)計(jì)...
    5e0g閱讀 199評(píng)論 0 1
  • 1.7 對(duì)象的創(chuàng)建和存在時(shí)間 1.7 對(duì)象的創(chuàng)建和存在時(shí)間 從技術(shù)角度說(shuō),OOP(面向?qū)ο蟪绦蛟O(shè)計(jì))只是涉及抽象的...
    5e0g閱讀 323評(píng)論 0 1

友情鏈接更多精彩內(nèi)容