Spring事務(wù)失效之常見場景分析
一、事務(wù)方法訪問修飾符非public,導(dǎo)致事務(wù)失效
1、實(shí)例
2、解決
方式一:將方法修飾符改為public
方式二:開啟AspectJ代理模式
3、注意
如果事務(wù)是static、final的,同樣無法通過動(dòng)態(tài)代理,事務(wù)也是不會(huì)生效的?! ?/p>
Spring的聲明式事務(wù)是基于動(dòng)態(tài)代理實(shí)現(xiàn)的,我們無法重寫final修飾的方法;
不管是JDK動(dòng)態(tài)代理還是Cglib的動(dòng)態(tài)代理,就是要通過代理的方式獲取到代理的具體對象,而static方法修飾的方法是屬于類的,不屬于任何對象,所以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注解或者使用其他能注冊成Spring Bean的方式或注解。
五、catch掉異常之后,沒有再次拋出異常,導(dǎo)致事務(wù)失效
1、實(shí)例
2、解決
3、注意
如果在加有事務(wù)的方法內(nèi),使用了try…catch…語句塊對異常進(jìn)行了捕獲,而catch語句塊沒有throw new RuntimeException異?;蛘逽pring支持的異常類型,則事務(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)文章
Spring使用@Autowired注解實(shí)現(xiàn)自動(dòng)裝配方式
這篇文章主要介紹了Spring使用@Autowired注解實(shí)現(xiàn)自動(dòng)裝配方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot @CompentScan excludeFilters配置無效的解決方案
這篇文章主要介紹了SpringBoot @CompentScan excludeFilters配置無效的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn)
本文主要介紹了maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06Java實(shí)現(xiàn)產(chǎn)生隨機(jī)字符串主鍵的UUID工具類
這篇文章主要介紹了Java實(shí)現(xiàn)產(chǎn)生隨機(jī)字符串主鍵的UUID工具類,涉及java隨機(jī)數(shù)與字符串遍歷、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Plugin ‘org.springframework.boot:spring-boot-maven-plug
這篇文章給大家介紹了Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found的解決方案,親測可用,文中給出了兩種解決方法,需要的朋友可以參考下2024-01-01Java用jxl讀取excel并保存到數(shù)據(jù)庫的方法
這篇文章主要為大家詳細(xì)介紹了Java用jxl讀取excel并保存到數(shù)據(jù)庫的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10idea中一鍵自動(dòng)生成序列化serialVersionUID方式
這篇文章主要介紹了idea中一鍵自動(dòng)生成序列化serialVersionUID方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09