spring事務(wù)異?;貪L實(shí)例解析
最近遇到了事務(wù)不回滾的情況,我還考慮說JPA的事務(wù)有bug?我想多了.......
為了打印清楚日志,很多方法我都加tyrcatch,在catch中打印日志。但是這邊情況來了,當(dāng)這個(gè)方法異常時(shí)候日志是打印了,但是加的事務(wù)卻沒有回滾。
例:
類似這樣的方法不會(huì)回滾(一個(gè)方法出錯(cuò),另一個(gè)方法不會(huì)回滾):
if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Exception e) { logger.info("能力開通接口,開戶異常,異常信息:"+e); } }
下面的方法回滾(一個(gè)方法出錯(cuò),另一個(gè)方法會(huì)回滾):
if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Exception e) { logger.info("能力開通接口,開戶異常,異常信息:"+e); throw new RuntimeException(); } }
或者:
if(userSave){ try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Exception e) { logger.info("能力開通接口,開戶異常,異常信息:"+e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }
為什么不會(huì)滾呢??是對(duì)spring的事務(wù)機(jī)制不明白。!!
*****默認(rèn)spring事務(wù)只在發(fā)生未被捕獲的runtimeexcetpion時(shí)才回滾。******
springaop異常捕獲原理:被攔截的方法需顯式拋出異常,并不能經(jīng)任何處理,這樣aop代理才能捕獲到方法的異常,才能進(jìn)行回滾,默認(rèn)情況下aop只捕獲runtimeexception的異常,但可以通過。
配置來捕獲特定的異常并回滾
換句話說在service的方法中不使用trycatch或者在catch中最后加上thrownewruntimeexcetpion(),這樣程序異常時(shí)才能被aop捕獲進(jìn)而回滾
解決方案:
方案1.例如service層處理事務(wù),那么service中的方法中不做異常捕獲,或者在catch語句中最后增加thrownewRuntimeException()語句,以便讓aop捕獲異常再去回滾,并且在service上層(webservice客戶端,view層action)要繼續(xù)捕獲這個(gè)異常并處理
方案2.在service層方法的catch語句中增加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();語句,手動(dòng)回滾,這樣上層就無需去處理異常(現(xiàn)在項(xiàng)目的做法)
總結(jié)
以上就是本文關(guān)于spring事務(wù)異?;貪L實(shí)例解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式
Spring Boot是一個(gè)用于構(gòu)建獨(dú)立的、可執(zhí)行的Spring應(yīng)用程序的框架,結(jié)合使用Spring Boot和Docker,可以方便地將應(yīng)用程序部署到不同的環(huán)境中本文,主要介紹了SpringBoot打包成Docker鏡像的幾種實(shí)現(xiàn)方式,感興趣的可以了解一下2024-01-01Spring Boot外部化配置實(shí)戰(zhàn)解析
這篇文章主要介紹了Spring Boot外部化配置實(shí)戰(zhàn)解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06基于Eclipse 的JSP/Servlet的開發(fā)環(huán)境的搭建(圖文)
本文將會(huì)詳細(xì)地展示如何搭建JSP的開發(fā)環(huán)境。本次教程使用的是最新版的Eclipse 2018-09編輯器和最新版的Apache Tomcat v9.0,步驟詳細(xì),內(nèi)容詳盡,適合零基礎(chǔ)學(xué)者作為學(xué)習(xí)參考2018-12-12Springboot初始化項(xiàng)目并完成登入注冊(cè)的全過程
工作之余,想要學(xué)習(xí)一下SpringBoot,通過網(wǎng)絡(luò)大量教程最終成功運(yùn)行SpringBoot項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于Springboot初始化項(xiàng)目并完成登入注冊(cè)的相關(guān)資料,需要的朋友可以參考下2022-10-10elasticsearch索引創(chuàng)建create?index集群matedata更新
這篇文章主要介紹了elasticsearch索引創(chuàng)建create?index及集群matedata更新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04