SpringBoot?@Transactional事務(wù)不生效排查方式
問題描述
在開發(fā)Spring Boot項(xiàng)目時(shí),方法使用了@Transactional注解,但是當(dāng)方法拋出異常時(shí),數(shù)據(jù)沒有回滾。
解決方法
經(jīng)排查,發(fā)現(xiàn)是數(shù)據(jù)庫(kù)引擎搞的鬼。
之前在建mysql數(shù)據(jù)庫(kù)表的時(shí)候,忘記修改表使用的引擎,引擎使用的是MyISAM,而MyISAM是不支持事務(wù)的,只需將引擎改為InnoDB即可。
排查步驟
當(dāng)@Transactional事務(wù)不生效的時(shí)候,可以遵循以下排查步驟:
1、查看數(shù)據(jù)庫(kù)或表,設(shè)置的引擎。MyISAM是不支持事務(wù)的,必須改為InnoDb。
2、@Transactional注解的方法是否為public。如果應(yīng)用在protected、private或者 package的方法上,不會(huì)報(bào)錯(cuò),但是事務(wù)設(shè)置不會(huì)起作用。
3、@Transactional所注解的方法所在的類,是否已經(jīng)使用了注解@Service或@Component等。
4、需要調(diào)用該方法,且需要支持事務(wù)特性的調(diào)用方,是在 @Transactional所在的類的外面。
注意:類內(nèi)部的其他方法調(diào)用這個(gè)注解了@Transactional的方法,事務(wù)是不會(huì)起作用的。
5、注解為事務(wù)范圍的方法中,事務(wù)的回滾僅僅對(duì)于unchecked的異常有效。對(duì)于checked異常無效。也就是說事務(wù)回滾僅僅發(fā)生在出現(xiàn)RuntimeException或Error的時(shí)候。
那么什么是checked異常呢?
java里面將派生于Error或者RuntimeException(比如空指針,1/0)的異常稱為unchecked異常,其他繼承自java.lang.Exception得異常統(tǒng)稱為Checked Exception,如IOException、TimeoutException等
通俗一點(diǎn)就是:
- 代碼中出現(xiàn)的空指針等異常,會(huì)被回滾。
- 而文件讀寫、網(wǎng)絡(luò)超時(shí)問題等,spring就沒法回滾了。
unchecked異常,回滾解決辦法
方法一
手動(dòng)回滾。
給注解加上參數(shù)如:
@Transactional(rollbackFor=Exception.class)
方法二
如上述分析。
對(duì)uncheck異常進(jìn)行catch,然后拋出RuntimeException異常。
方法三
在service層方法的catch語(yǔ)句中增加:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
語(yǔ)句,手動(dòng)回滾,這樣上層就無需去處理異常。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot事務(wù)注解@Transactional失效場(chǎng)景與解決方案
- 如何使用Spring boot的@Transactional進(jìn)行事務(wù)管理
- Springboot @Transactional大事務(wù)處理的幾點(diǎn)建議
- Springboot中@Transactional注解與異常處理機(jī)制方式
- 解決SpringBoot中使用@Transactional注解遇到的問題
- springboot中使用@Transactional注解事物不生效的坑
- springboot中事務(wù)管理@Transactional的注意事項(xiàng)與使用場(chǎng)景
- Spring Boot的測(cè)試類中使用 @Transactional 注解
相關(guān)文章
@SpringBootTest 注解報(bào)紅問題及解決
這篇文章主要介紹了@SpringBootTest 注解報(bào)紅問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
Java零基礎(chǔ)教程之Windows下安裝 JDK的方法圖解
這篇文章主要介紹了Java零基礎(chǔ)教程之Windows下安裝 JDK的方法圖解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
淺析SpringBoot多數(shù)據(jù)源實(shí)現(xiàn)方案
現(xiàn)在很多項(xiàng)目的開發(fā)過程中,可能涉及到多個(gè)數(shù)據(jù)源,像讀寫分離的場(chǎng)景,或者因?yàn)闃I(yè)務(wù)復(fù)雜,導(dǎo)致不同的業(yè)務(wù)部署在不同的數(shù)據(jù)庫(kù)上,那么這樣的場(chǎng)景,我們應(yīng)該如何在代碼中簡(jiǎn)潔方便的切換數(shù)據(jù)源呢,本文介紹SpringBoot多數(shù)據(jù)源實(shí)現(xiàn)方案,感興趣的朋友跟隨小編一起看看吧2024-02-02
Java實(shí)現(xiàn)圖片翻轉(zhuǎn)以及任意角度旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)圖片翻轉(zhuǎn)以及任意角度旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
教你如何用Eclipse創(chuàng)建一個(gè)Maven項(xiàng)目
這篇文章主要介紹了教你如何用Eclipse創(chuàng)建一個(gè)Maven項(xiàng)目,文中有非常詳細(xì)的代碼示例,對(duì)正在入門Java的小伙伴們是非常有幫助的喲,需要的朋友可以參考下2021-05-05
java在文件尾部追加內(nèi)容的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄猨ava在文件尾部追加內(nèi)容的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
Java中你絕對(duì)沒用過的一個(gè)關(guān)鍵字Record的使用
這篇文章主要給大家介紹一個(gè)?Java?中的一個(gè)關(guān)鍵字?Record,那?Record?關(guān)鍵字跟不可變類有什么關(guān)系呢?看完今天的文章你就知道了,快跟隨小編一起學(xué)習(xí)一下吧2022-11-11

