溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

分析動(dòng)態(tài)代理給Spring事務(wù)埋下的坑

發(fā)布時(shí)間:2020-07-08 06:59:02 來源:網(wǎng)絡(luò) 閱讀:46500 作者:zfz_linux_boy 欄目:軟件技術(shù)

前言

Spring的聲明式事務(wù)讓我們不在編寫獲得連接、關(guān)閉連接、開啟事務(wù)、提交事務(wù)、回滾事務(wù)等代碼,通過一個(gè)簡(jiǎn)單的@Transactional注解,就讓我們輕松進(jìn)行事務(wù)處理。我們知道Spring事務(wù)基于AOP,采用動(dòng)態(tài)代理實(shí)現(xiàn),雖然使用簡(jiǎn)單,但是在實(shí)際場(chǎng)景中,我們也會(huì)遇到一些坑。而往往遇到坑之后,我們都會(huì)茫然,這是由于沒有對(duì)Spring事務(wù)的實(shí)現(xiàn)機(jī)制做一點(diǎn)了解導(dǎo)致的。因此本篇博客將從原理的角度分析下動(dòng)態(tài)代理給Spring事務(wù)埋下的坑!

從動(dòng)態(tài)代理到Spring事務(wù)

UserService:

分析動(dòng)態(tài)代理給Spring事務(wù)埋下的坑

txMethod和txMethod2方法模擬事務(wù)方法(相當(dāng)于@Transactional)

noTxMethod方法是普通方法

UserServiceImpl

分析動(dòng)態(tài)代理給Spring事務(wù)埋下的坑

在Spring事務(wù)中,我們往往是在Service層進(jìn)行事務(wù)控制。

我們?cè)赨serServiceImpl中想模擬的是:

一個(gè)有事務(wù)的方法,去調(diào)用另一個(gè)有事務(wù)的方法,會(huì)怎么樣?

一個(gè)沒有事務(wù)的方法,去調(diào)用一個(gè)有事務(wù)的方法,會(huì)怎么樣?

UserHandler

分析動(dòng)態(tài)代理給Spring事務(wù)埋下的坑

這里為了簡(jiǎn)便,通過方法名稱來判斷是否開啟事務(wù)。

顯然,txMethod方法、txMethod2方法都“應(yīng)該”開啟事務(wù)。

UserTest

分析動(dòng)態(tài)代理給Spring事務(wù)埋下的坑

下面,我們來說下運(yùn)行結(jié)果:

proxyInstance.txMethod2()方法,會(huì)開啟事務(wù),這沒有問題。

proxyInstance.txMethod()方法,雖然在事務(wù)方法txMethod()內(nèi)部調(diào)用了txMethod2()事務(wù)方法,但是并沒有新開啟事務(wù)。

proxyInstance.noTxMethod()方法,雖然在沒有事務(wù)的方法noTxMethod()內(nèi)部調(diào)用了有事務(wù)的txMethod2()方法,但是并沒有開啟事務(wù)。

下面讓我們來對(duì)應(yīng)下Spring事務(wù)中的現(xiàn)象:

分析動(dòng)態(tài)代理給Spring事務(wù)埋下的坑

上述的情況,說白了,就是在一個(gè)Service內(nèi)部,事務(wù)方法之間的嵌套調(diào)用,普通方法和事務(wù)方法之間的嵌套調(diào)用,都不會(huì)開啟新的事務(wù)!

為什么會(huì)這樣呢?

其實(shí)通過上面的動(dòng)態(tài)代理的代碼,你應(yīng)該可以發(fā)現(xiàn):

動(dòng)態(tài)代理最終都是要調(diào)用原始對(duì)象的,而原始對(duì)象在去調(diào)用方法時(shí),是不會(huì)再觸發(fā)代理了!

那么如何解決呢?

很簡(jiǎn)單,我們完全可以在抽出一個(gè)XxxService,在其內(nèi)部調(diào)用UserService.txMethod()和UserService.txMethod2()方法即可??偠灾?,避免在一個(gè)Service內(nèi)部進(jìn)行事務(wù)方法的嵌套調(diào)用?。ㄒ?yàn)閯?dòng)態(tài)代理導(dǎo)致這種場(chǎng)景事務(wù)失效了。)

好像Spring事務(wù)如此簡(jiǎn)單,但是背后卻有這些道道,你被坑過么?

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI