Spring事務(wù)失效場(chǎng)景及解決過(guò)程
Spring事務(wù)失效場(chǎng)景及解決過(guò)程

異常捕獲處理導(dǎo)致事務(wù)失效
- 場(chǎng)景:在轉(zhuǎn)賬代碼中,對(duì)可能出現(xiàn)的異常進(jìn)行捕獲處理后,事務(wù)可能失效。如在方法中添加
try-catch塊處理異常,當(dāng)異常發(fā)生時(shí),數(shù)據(jù)庫(kù)操作未按預(yù)期回滾。 - 原因:AOP實(shí)現(xiàn)的事務(wù)只能處理目標(biāo)拋出的異常,若目標(biāo)自己處理了異常,事務(wù)通知無(wú)法得知,導(dǎo)致事務(wù)失效。
- 解決方案:在
catch塊中再拋出RuntimeException異常,使事務(wù)能夠正??刂?。

拋出檢查異常導(dǎo)致事務(wù)失效
- 場(chǎng)景:在轉(zhuǎn)賬代碼中讀取文件時(shí)拋出
FileNotFoundException(檢查異常),事務(wù)失效。例如在代碼中讀取一個(gè)不存在的文件并拋出異常,此時(shí)轉(zhuǎn)賬操作部分執(zhí)行,未完全回滾。 - 原因:Spring默認(rèn)只會(huì)回滾非檢查異常(
Runtime異常),不會(huì)捕獲檢查異常。 - 解決方案:在
@Transactional注解中添加rollbackFor屬性,設(shè)置為Exception.class,使所有異常都能回滾事務(wù)。

非public方法導(dǎo)致事務(wù)失效
- 場(chǎng)景:將轉(zhuǎn)賬方法的
public修飾符刪除后,事務(wù)失效。如修改方法為非public后執(zhí)行轉(zhuǎn)賬操作,出現(xiàn)數(shù)據(jù)不一致,事務(wù)未正?;貪L。 - 原因:Spring為方法創(chuàng)建代理并添加事務(wù)通知的前提是方法必須是
public的,非public方法無(wú)法進(jìn)行代理。 - 解決方案:將方法改為
public即可解決事務(wù)失效問(wèn)題。
在面試中,若被問(wèn)到Spring中事務(wù)失效的場(chǎng)景,能說(shuō)出兩三條并詳細(xì)描述業(yè)務(wù)情況、產(chǎn)生原因及解決過(guò)程即可。
如闡述異常捕獲處理時(shí),說(shuō)明業(yè)務(wù)中可能存在的異常處理邏輯,以及如何因未正確拋出異常導(dǎo)致事務(wù)失效,最后強(qiáng)調(diào)手動(dòng)拋出RuntimeException解決問(wèn)題的方式。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis動(dòng)態(tài)sql之新增與更新方式
這篇文章主要介紹了mybatis動(dòng)態(tài)sql之新增與更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
java利用遞歸算法實(shí)現(xiàn)對(duì)文件夾的刪除功能
這篇文章主要介紹了java利用遞歸算法實(shí)現(xiàn)對(duì)文件夾的刪除功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
源碼解讀Spring-Integration執(zhí)行過(guò)程
Spring-Integration基于Spring,在應(yīng)用程序中啟用了輕量級(jí)消息傳遞,并支持通過(guò)聲明式適配器與外部系統(tǒng)集成,今天主要是看個(gè)簡(jiǎn)單的hello word進(jìn)來(lái)分析下整個(gè)執(zhí)行過(guò)程,感興趣的朋友一起看看吧2021-06-06
Java實(shí)現(xiàn)一個(gè)簡(jiǎn)易聊天室流程
這篇文章主要介紹了我的java課程設(shè)計(jì)一個(gè)多人聊天室(socket+多線程)本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
深入理解SpringMVC的參數(shù)綁定與數(shù)據(jù)響應(yīng)機(jī)制
本文將深入探討SpringMVC的參數(shù)綁定方式,包括基本類型、對(duì)象、集合等類型的綁定方式,以及如何處理參數(shù)校驗(yàn)和異常。同時(shí),本文還將介紹SpringMVC的數(shù)據(jù)響應(yīng)機(jī)制,包括如何返回JSON、XML等格式的數(shù)據(jù),以及如何處理文件上傳和下載。2023-06-06
Java中的xxl-job調(diào)度器線程池工作機(jī)制
xxl-job通過(guò)快慢線程池分離短時(shí)與長(zhǎng)時(shí)任務(wù),動(dòng)態(tài)降級(jí)超時(shí)任務(wù)至慢池,結(jié)合異步觸發(fā)和資源隔離機(jī)制,提升高頻調(diào)度的性能與穩(wěn)定性,支撐高并發(fā)場(chǎng)景下的可靠任務(wù)執(zhí)行,本文給大家介紹Java: xxl-job調(diào)度器線程池工作機(jī)制,感興趣的朋友一起看看吧2025-07-07
Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解
這篇文章主要介紹了Java中的權(quán)重算法(如Dubbo的負(fù)載均衡權(quán)重)詳解,負(fù)載均衡,其含義就是指將負(fù)載進(jìn)行平衡、分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行運(yùn)行,例如FTP服務(wù)器、Web服務(wù)器、企業(yè)核心應(yīng)用服務(wù)器和其它主要任務(wù)服務(wù)器等,從而協(xié)同完成工作任務(wù),需要的朋友可以參考下2023-08-08

