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

前言

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


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

UserService:

UserService接口

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

noTxMethod方法是普通方法

UserServiceImpl:

UserServiceImpl

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

我們在UserServiceImpl中想模擬的是:

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

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

UserHandler:

UserHandler

這里為了簡便步氏,通過方法名稱來判斷是否開啟事務(wù)响禽。

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

UserTest:

UserTest

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

proxyInstance.txMethod2()方法,會開啟事務(wù)侯繁,這沒有問題胖喳。

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

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

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

Spring事務(wù)

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

為什么會這樣呢?

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

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

那么如何解決呢搬瑰?

很簡單,我們完全可以在抽出一個(gè)XxxService控硼,在其內(nèi)部調(diào)用UserService.txMethod()和UserService.txMethod2()方法即可泽论。總而言之卡乾,避免在一個(gè)Service內(nèi)部進(jìn)行事務(wù)方法的嵌套調(diào)用R磴病(因?yàn)閯?dòng)態(tài)代理導(dǎo)致這種場景事務(wù)失效了。)


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

have a good weekend~

2017.11.04 zhangfengzhe

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末误堡,一起剝皮案震驚了整個(gè)濱河市钙姊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埂伦,老刑警劉巖煞额,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡膊毁,警方通過查閱死者的電腦和手機(jī)胀莹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婚温,“玉大人描焰,你說我怎么就攤上這事≌っ” “怎么了荆秦?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長力图。 經(jīng)常有香客問我步绸,道長,這世上最難降的妖魔是什么吃媒? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任瓤介,我火速辦了婚禮,結(jié)果婚禮上赘那,老公的妹妹穿的比我還像新娘刑桑。我一直安慰自己,他們只是感情好募舟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布祠斧。 她就那樣靜靜地躺著,像睡著了一般拱礁。 火紅的嫁衣襯著肌膚如雪琢锋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天觅彰,我揣著相機(jī)與錄音,去河邊找鬼钮热。 笑死填抬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隧期。 我是一名探鬼主播飒责,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仆潮!你這毒婦竟也來了宏蛉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤性置,失蹤者是張志新(化名)和其女友劉穎拾并,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗅义,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年屏歹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片之碗。...
    茶點(diǎn)故事閱讀 38,768評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝙眶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褪那,到底是詐尸還是另有隱情幽纷,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布博敬,位于F島的核電站友浸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冶忱。R本人自食惡果不足惜尾菇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望囚枪。 院中可真熱鬧派诬,春花似錦、人聲如沸链沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽括勺。三九已至缆八,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疾捍,已是汗流浹背奈辰。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乱豆,地道東北人奖恰。 一個(gè)月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像宛裕,于是被迫代替她去往敵國和親瑟啃。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理揩尸,服務(wù)發(fā)現(xiàn)蛹屿,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • 1.IOC與DI inverse of control 控制反轉(zhuǎn)我們創(chuàng)建對象的方式反轉(zhuǎn)了岩榆。以前對象的創(chuàng)建由開發(fā)人員...
    蕊er閱讀 317評論 0 0
  • 鷓鴣天·武夷行吟 一 細(xì)雨如酥作綺游错负,淡煙凝翠晚來收坟瓢。桐花滿嶺爭新紫,征雁晴空尋故丘湿颅。 堪嘯詠载绿,漫搜求。閑看白鷺竟...
    倚劍白云天閱讀 404評論 0 0
  • 弟媳吃醋的發(fā)來信息說油航,五姐崭庸,媽說這最大的雞蛋果要留給你回來吃。我無言谊囚,只作大笑表情作回復(fù)怕享。 真正的愛...
    五月白蘭花閱讀 324評論 5 2