Spring事務失效之常見場景分析
一、事務方法訪問修飾符非public,導致事務失效
1、實例
2、解決
方式一:將方法修飾符改為public
方式二:開啟AspectJ代理模式
3、注意
如果事務是static、final的,同樣無法通過動態(tài)代理,事務也是不會生效的。
Spring的聲明式事務是基于動態(tài)代理實現(xiàn)的,我們無法重寫final修飾的方法;
不管是JDK動態(tài)代理還是Cglib的動態(tài)代理,就是要通過代理的方式獲取到代理的具體對象,而static方法修飾的方法是屬于類的,不屬于任何對象,所以static方法不能被重寫,即便寫法上是重寫,但是并不具備重寫的含義,也就是說static方法也不被進行動態(tài)代理。
二、@Transactional注解的方法拋出的異常不是spring的事務支持的異常,導致事務失效
1、實例
2、解決
3、注意
spring的事務只支持未檢查異常(unchecked),不支持已檢查異常(checked)。
三、數(shù)據(jù)表本身是不支持事務,導致事務失效
1、實例
如果使用MySQL且存儲引擎是MyISAM,則事務是不起作用的,原因是MyIASM不支持事務。
2、解決
數(shù)據(jù)表可以改為InnoDB存儲引擎,支持事務
四、@Transactional注解所在的類沒有被spring管理,導致事務失效
1、實例
2、解決
加上@Service注解或者使用其他能注冊成Spring Bean的方式或注解。
五、catch掉異常之后,沒有再次拋出異常,導致事務失效
1、實例
2、解決
3、注意
如果在加有事務的方法內(nèi),使用了try…catch…語句塊對異常進行了捕獲,而catch語句塊沒有throw new RuntimeException異?;蛘逽pring支持的異常類型,則事務不會回滾。
六、方法自身(this)調(diào)用問題,導致事務失效
非事務方法insert()中調(diào)用的自身類的事務方法insertUser()。
1、實例
2、解析
3、解決
方式一:
方式二:
方式三:
方式四:
七、數(shù)據(jù)源沒有配置事務管理器
導致事務失效
八、傳播類型不支持事務
導致事務失效
1、實例
2、注意
九、多線程調(diào)用,導致事務失效
1、實例
2、解析
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring使用@Autowired注解實現(xiàn)自動裝配方式
這篇文章主要介紹了Spring使用@Autowired注解實現(xiàn)自動裝配方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot @CompentScan excludeFilters配置無效的解決方案
這篇文章主要介紹了SpringBoot @CompentScan excludeFilters配置無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11Java實現(xiàn)產(chǎn)生隨機字符串主鍵的UUID工具類
這篇文章主要介紹了Java實現(xiàn)產(chǎn)生隨機字符串主鍵的UUID工具類,涉及java隨機數(shù)與字符串遍歷、轉(zhuǎ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ù)庫的方法
這篇文章主要為大家詳細介紹了Java用jxl讀取excel并保存到數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10idea中一鍵自動生成序列化serialVersionUID方式
這篇文章主要介紹了idea中一鍵自動生成序列化serialVersionUID方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09