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

