Spring事務(wù)失效之常見場(chǎng)景分析
一、事務(wù)方法訪問修飾符非public,導(dǎo)致事務(wù)失效
1、實(shí)例

2、解決
方式一:將方法修飾符改為public
方式二:開啟AspectJ代理模式
3、注意
如果事務(wù)是static、final的,同樣無法通過動(dòng)態(tài)代理,事務(wù)也是不會(huì)生效的。
Spring的聲明式事務(wù)是基于動(dòng)態(tài)代理實(shí)現(xiàn)的,我們無法重寫final修飾的方法;
不管是JDK動(dòng)態(tài)代理還是Cglib的動(dòng)態(tài)代理,就是要通過代理的方式獲取到代理的具體對(duì)象,而static方法修飾的方法是屬于類的,不屬于任何對(duì)象,所以static方法不能被重寫,即便寫法上是重寫,但是并不具備重寫的含義,也就是說static方法也不被進(jìn)行動(dòng)態(tài)代理。
二、@Transactional注解的方法拋出的異常不是spring的事務(wù)支持的異常,導(dǎo)致事務(wù)失效
1、實(shí)例

2、解決
3、注意
spring的事務(wù)只支持未檢查異常(unchecked),不支持已檢查異常(checked)。
三、數(shù)據(jù)表本身是不支持事務(wù),導(dǎo)致事務(wù)失效
1、實(shí)例
如果使用MySQL且存儲(chǔ)引擎是MyISAM,則事務(wù)是不起作用的,原因是MyIASM不支持事務(wù)。
2、解決
數(shù)據(jù)表可以改為InnoDB存儲(chǔ)引擎,支持事務(wù)
四、@Transactional注解所在的類沒有被spring管理,導(dǎo)致事務(wù)失效
1、實(shí)例

2、解決
加上@Service注解或者使用其他能注冊(cè)成Spring Bean的方式或注解。
五、catch掉異常之后,沒有再次拋出異常,導(dǎo)致事務(wù)失效
1、實(shí)例

2、解決

3、注意
如果在加有事務(wù)的方法內(nèi),使用了try…catch…語句塊對(duì)異常進(jìn)行了捕獲,而catch語句塊沒有throw new RuntimeException異常或者Spring支持的異常類型,則事務(wù)不會(huì)回滾。
六、方法自身(this)調(diào)用問題,導(dǎo)致事務(wù)失效
非事務(wù)方法insert()中調(diào)用的自身類的事務(wù)方法insertUser()。
1、實(shí)例

2、解析

3、解決
方式一:

方式二:


方式三:

方式四:

七、數(shù)據(jù)源沒有配置事務(wù)管理器
導(dǎo)致事務(wù)失效
八、傳播類型不支持事務(wù)
導(dǎo)致事務(wù)失效
1、實(shí)例

2、注意

九、多線程調(diào)用,導(dǎo)致事務(wù)失效
1、實(shí)例

2、解析

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式
這篇文章主要介紹了Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
java新增關(guān)聯(lián)的三張表,每張表要求都插入集合,代碼實(shí)現(xiàn)方式
這篇文章主要介紹了java新增關(guān)聯(lián)的三張表,每張表要求都插入集合,代碼實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
spring無法引入注解及import org.springframework.web.bind.annota
本文主要介紹了spring無法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
SpringBoot多線程與任務(wù)調(diào)度總結(jié)
多線程與任務(wù)調(diào)度是java開發(fā)中必須掌握的技能,本文主要介紹了SpringBoot多線程與任務(wù)調(diào)度總結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
IDEA解決src和resource下創(chuàng)建多級(jí)目錄的操作
這篇文章主要介紹了IDEA解決src和resource下創(chuàng)建多級(jí)目錄的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
java中不同版本JSONObject區(qū)別小結(jié)
本文主要介紹了java中不同版本JSONObject區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

