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)文章
Java報(bào)錯(cuò)Java.text.ParseException的解決方法匯總
在Java開(kāi)發(fā)的復(fù)雜世界中,錯(cuò)誤處理是開(kāi)發(fā)者必須面對(duì)的關(guān)鍵挑戰(zhàn)之一,其中,Java.text.ParseException就像一個(gè)隱藏在代碼叢林中的陷阱,常常讓開(kāi)發(fā)者們陷入困惑,本文給大家介紹了Java報(bào)錯(cuò)Java.text.ParseException的解決方法,需要的朋友可以參考下2024-10-10
Minio與SpringBoot使用okhttp3問(wèn)題解決
這篇文章主要介紹了Minio與SpringBoot使用okhttp3問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法
這篇文章主要介紹了idea 設(shè)置鼠標(biāo)懸停(放上)彈出注釋的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
淺談SpringCloud?Alibaba和SpringCloud的區(qū)別
這篇文章主要介紹了淺談SpringCloud?Alibaba和SpringCloud的區(qū)別,Spring?Cloud?Netflix框架也屬于Spring?Cloud,但是Netflix并不是由spring來(lái)進(jìn)行開(kāi)發(fā)的,需要的朋友可以參考下2023-05-05
淺析Java 常用的 4 種加密方式(MD5+Base64+SHA+BCrypt)
這篇文章主要介紹了Java 常用的 4 種加密方式(MD5+Base64+SHA+BCrypt),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
使用Eclipse開(kāi)發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的問(wèn)題
這篇文章主要介紹了使用Eclipse開(kāi)發(fā)工具如何解決Java Compiler中Annotation Processin不出現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-11-11
Java為實(shí)體類(lèi)動(dòng)態(tài)添加屬性的方法詳解
這篇文章主要介紹了Java如何給已有實(shí)體類(lèi)動(dòng)態(tài)的添加字段并返回新的實(shí)體對(duì)象且不影響原來(lái)的實(shí)體對(duì)象結(jié)構(gòu)。文中的方法講解詳細(xì),需要的可以參考一下2022-06-06
SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式
這篇文章主要介紹了SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java實(shí)戰(zhàn)之利用POI生成Excel圖表
Apache POI是Java生態(tài)中處理Office文檔的核心工具,這篇文章主要為大家詳細(xì)介紹了如何在Excel中創(chuàng)建折線(xiàn)圖,柱狀圖,餅圖等常見(jiàn)圖表,需要的可以參考下2025-02-02

