Java?Spring聲明式事務(wù)失效情況解決辦法(天翼通訊)
事務(wù)失效排查清單
當(dāng)事務(wù)不生效時(shí),檢查這個(gè)清單:
? 方法是否是public?
? 異常是否被正確拋出?
? 是否配置了正確的rollbackFor?
? 是否是內(nèi)部調(diào)用?
? 傳播行為設(shè)置是否正確?
? 是否配置了事務(wù)管理器?
? 數(shù)據(jù)源是否支持事務(wù)?
Spring事務(wù)默認(rèn)只回滾RuntimeException和Error。
想象Spring事務(wù)管理就像一個(gè)馬戲團(tuán)導(dǎo)演,@Transactional注解就是他的指揮棒。但有時(shí)候,演員們不按導(dǎo)演的指揮來(lái)表演!
失效場(chǎng)景1:內(nèi)部方法調(diào)用 - "導(dǎo)演被架空"
@Service
public class CircusService {
public void bigShow() {
System.out.println("開(kāi)始大表演...");
// 問(wèn)題:在同一個(gè)類(lèi)內(nèi)部調(diào)用事務(wù)方法
fireDance(); // 事務(wù)失效!
// 相當(dāng)于:導(dǎo)演喊"開(kāi)始",但演員自己演自己的
}
@Transactional
public void fireDance() {
System.out.println("火焰舞蹈開(kāi)始...");
// 數(shù)據(jù)庫(kù)操作...
if (Math.random() > 0.5) {
throw new RuntimeException("火焰太大!");
}
// 即使拋異常,事務(wù)也不會(huì)回滾!
}
}為什么會(huì)失效?
Spring事務(wù)基于AOP代理
內(nèi)部調(diào)用繞過(guò)了代理對(duì)象
就像導(dǎo)演在外面喊,但演員在帳篷里聽(tīng)不見(jiàn)
失效場(chǎng)景2:異常類(lèi)型不對(duì) - "導(dǎo)演認(rèn)錯(cuò)信號(hào)"
@Service
public class CircusService {
@Transactional
public void tightropeWalking() throws Exception {
System.out.println("走鋼絲表演...");
// 數(shù)據(jù)庫(kù)操作...
// 問(wèn)題:拋出了檢查異常,但Spring默認(rèn)只回滾運(yùn)行時(shí)異常
if (balanceTooLow()) {
throw new Exception("平衡感不好!"); // 事務(wù)不回滾!
}
// 只有RuntimeException才會(huì)觸發(fā)回滾
throw new RuntimeException("摔下來(lái)了!"); // 這個(gè)會(huì)回滾
}
}失效場(chǎng)景3:異常被吃掉 - "導(dǎo)演沒(méi)看到事故"
@Service
public class CircusService {
@Transactional
public void lionTaming() {
try {
System.out.println("馴獅表演...");
// 數(shù)據(jù)庫(kù)操作...
throw new RuntimeException("獅子發(fā)怒了!");
} catch (Exception e) {
System.out.println("悄悄處理異常,導(dǎo)演沒(méi)看見(jiàn)...");
// 異常被捕獲,事務(wù)不知道要回滾!
}
}
}失效場(chǎng)景4:非public方法 - "導(dǎo)演管不了后臺(tái)"
@Service
public class CircusService {
@Transactional
private void backstagePreparation() { // 私有方法!
System.out.println("后臺(tái)準(zhǔn)備工作...");
// 事務(wù)失效!Spring代理無(wú)法攔截私有方法
}
@Transactional
protected void equipmentCheck() { // protected方法!
// 同樣可能失效,取決于代理方式
}
}失效場(chǎng)景5:錯(cuò)誤的傳播機(jī)制 - "導(dǎo)演指揮混亂"
@Service
public class CircusService {
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void clownPerformance() {
System.out.println("小丑表演...");
// 這個(gè)方法根本不在事務(wù)中運(yùn)行!
acrobatics(); // 即使調(diào)用的事務(wù)方法,也不會(huì)加入事務(wù)
}
@Transactional
public void acrobatics() {
// 因?yàn)橥鈱記](méi)有事務(wù),這里會(huì)開(kāi)啟新事務(wù)
}
}失效場(chǎng)景6:多數(shù)據(jù)源配置問(wèn)題 - "多個(gè)導(dǎo)演搶指揮"
@Service
public class CircusService {
// 如果配置了多個(gè)事務(wù)管理器,需要指定用哪個(gè)
@Transactional // 不指定的話,Spring不知道用哪個(gè)TransactionManager
public void multiRingShow() {
// 操作多個(gè)數(shù)據(jù)源...
}
}解決方案:
@Transactional("firstTransactionManager") // 明確指定事務(wù)管理器
public void mainRingShow() {
// 使用第一個(gè)數(shù)據(jù)源的事務(wù)
}
?
@Transactional("secondTransactionManager")
public void secondRingShow() {
// 使用第二個(gè)數(shù)據(jù)源的事務(wù)
}總結(jié)
內(nèi)部調(diào)用 = 導(dǎo)演在外面喊,演員在帳篷里聽(tīng)不見(jiàn)
異常類(lèi)型不對(duì) = 導(dǎo)演只認(rèn)RuntimeException這種"緊急信號(hào)
異常被吃掉 = 事故發(fā)生了,但沒(méi)人告訴導(dǎo)演
非public方法 = 導(dǎo)演管不了后臺(tái)私事
錯(cuò)誤傳播機(jī)制 = 導(dǎo)演指揮混亂
多數(shù)據(jù)源配置問(wèn)題 = 多個(gè)導(dǎo)演搶指揮
記?。篠pring事務(wù)就像馬戲團(tuán)導(dǎo)演,必須讓他在正確的時(shí)間、正確的地點(diǎn)、看到正確的事情,才能有效管理整個(gè)表演!
到此這篇關(guān)于Java Spring聲明式事務(wù)失效情況解決辦法的文章就介紹到這了,更多相關(guān)Java Spring聲明式事務(wù)失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)Redis的集合(set)命令操作
這篇文章主要介紹了Java實(shí)現(xiàn)Redis的集合(set)命令操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Java編程實(shí)現(xiàn)基于圖的深度優(yōu)先搜索和廣度優(yōu)先搜索完整代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)基于圖的深度優(yōu)先搜索和廣度優(yōu)先搜索完整代碼,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12
java實(shí)現(xiàn)emqx設(shè)備上下線監(jiān)聽(tīng)詳解
這篇文章主要為大家介紹了java實(shí)現(xiàn)emqx設(shè)備上下線監(jiān)聽(tīng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
RabbitMQ實(shí)現(xiàn)消費(fèi)端限流的步驟
消費(fèi)者端限流的主要目的是控制消費(fèi)者每次從 RabbitMQ 中獲取的消息數(shù)量,從而實(shí)現(xiàn)消息處理的流量控制,這篇文章主要介紹了RabbitMQ如何實(shí)現(xiàn)消費(fèi)端限流,需要的朋友可以參考下2024-03-03
MyBatis-Plus 樂(lè)觀鎖的具體實(shí)現(xiàn)
MyBatis-Plus 的樂(lè)觀鎖通過(guò)簡(jiǎn)單的配置和注解,可以輕松實(shí)現(xiàn)高并發(fā)場(chǎng)景下的數(shù)據(jù)并發(fā)控制,具有一定的參考價(jià)值,感興趣的可以了解一下2024-09-09

