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

