spring 事務(wù)管理之傳播行為對(duì)回滾的影響(二)

世上無難事敢朱,只要肯攀登

不同service中的A方法中調(diào)用了B方法位喂。兩個(gè)方法只有一個(gè)用到事務(wù)疗垛,那么程序的最終結(jié)果和代碼的執(zhí)行順序有很大關(guān)系

A方法創(chuàng)建了事務(wù)挠阁,B方法無事務(wù)運(yùn)行

我曾經(jīng)以為在A方法中拋出運(yùn)行時(shí)異常宾肺,A方法事務(wù)被回滾。B方法因?yàn)闆]有納入事務(wù)的管理侵俗,所以對(duì)B方法毫無影響锨用。但是經(jīng)過我的實(shí)踐這個(gè)想法是錯(cuò)誤的,程序的最終結(jié)果其實(shí)和代碼的執(zhí)行順序有很大關(guān)系隘谣。下面準(zhǔn)備實(shí)驗(yàn):

我們給InsertUsers方法加上REQUIRED級(jí)別的傳播行為增拥,給InsertCuser方法加上NOT_SUPPORTED級(jí)別的傳播行為。讓InsertUsers方法使用事務(wù)寻歧,InsertCuser方法無事務(wù)狀態(tài)執(zhí)行掌栅。這下肯定有人問:InsertCuser方法不加事務(wù)注解不就能保證InsertCuser無事務(wù)運(yùn)行了嗎?事實(shí)上因?yàn)閟pring的事務(wù)傳播行為码泛,InsertUsers會(huì)將事務(wù)傳播給InsertCuser猾封,導(dǎo)致兩個(gè)方法都使用InsertUsers上的事務(wù),所以必須要給InsertCuser方法加上NOT_SUPPORTED級(jí)別的傳播行為弟晚。不信可以看看我的這篇文章 http://www.reibang.com/p/bc3cbacf9e70 里面有做對(duì)應(yīng)實(shí)驗(yàn)

  @Transactional(propagation = Propagation.REQUIRED)
   public void InsertUsers(Users users) {
     忘衍。。卿城。
    }

  @Transactional(propagation=Propagation.NOT_SUPPORTED)
   public void InsertCuser(Cuser cuser) {
     枚钓。。瑟押。
   }

然后分別將下列引發(fā)運(yùn)行時(shí)異常的語句放到InsertUsers方法或InsertCuser方法中搀捷,觀察事務(wù)回滾情況

//運(yùn)行時(shí)異常
int i = 1/0;

情況一:

  • 如圖在InsertUsers方法中,將拋出異常的代碼行放到調(diào)用InsertCuser方法之前。程序運(yùn)行至此出現(xiàn)異常后根本不會(huì)再往下執(zhí)行了嫩舟,也就是說InsertCuser方法不會(huì)得到執(zhí)行氢烘!即使InsertCuser方法沒有納入事務(wù)的管理,可以理解為此時(shí)它也是執(zhí)行不成功的~ 查看cuser表數(shù)據(jù)為空驗(yàn)證了這個(gè)結(jié)論


    image.png
  • 再來看拋出異常的代碼行放到調(diào)用InsertCuser方法后家厌,結(jié)果就不同了播玖。此時(shí)InsertCuser方法會(huì)得到執(zhí)行,因?yàn)镮nsertCuser方法沒有納入到事務(wù)管理饭于,它不會(huì)回滾蜀踏。執(zhí)行程序后查看數(shù)據(jù)庫cuser表數(shù)據(jù)多出了一行,users表中沒有數(shù)據(jù)


    image.png

情況二:

  • 再將除0異常代碼放到?jīng)]有納入事務(wù)管理的InsertCuser方法方法中掰吕,觀察事務(wù)回滾情況
    把出現(xiàn)異常代碼行放到數(shù)據(jù)庫操作之前果覆,程序運(yùn)行結(jié)果是 InsertUsers和InsertCuser方法數(shù)據(jù)庫操作均失效。因?yàn)镮nsertUsers中存在事務(wù)殖熟,InsertCuser會(huì)隱式拋出運(yùn)行時(shí)異常到InsertUsers中局待,InsertUsers事務(wù)得到回滾;而InsertCuser自身數(shù)據(jù)庫操作失效的原因是數(shù)據(jù)庫操作語句那行根本沒有得到執(zhí)行菱属。


    image.png
  • 若把異常代碼行放到數(shù)據(jù)庫操作之后钳榨,這次InsertUsers同樣因?yàn)槭聞?wù)遇到異常而回滾,而InsertCuser操作成功執(zhí)行纽门。


    image.png
A方法無事務(wù)運(yùn)行重绷,B創(chuàng)建事務(wù)

我們不給InsertUsers方法使用事務(wù)注解,給InsertCuser方法加上REQUIRED級(jí)別的傳播行為膜毁。讓InsertUsers無事務(wù)狀態(tài)執(zhí)行,InsertCuser方法創(chuàng)建事務(wù)愤钾。InsertUsers之所以沒有納入事務(wù)的管理是因?yàn)?code>事務(wù)不會(huì)從被調(diào)用者傳播到調(diào)用者

   public void InsertUsers(Users users)  {
     瘟滨。。能颁。
   }

   @Transactional(propagation=Propagation.REQUIRED)
   public void InsertCuser(Cuser cuser)  {
     杂瘸。。伙菊。
   }

情況一:

  • 在InsertUsers方法中败玉,把異常代碼行放到insert語句之前
    兩者都不會(huì)插入數(shù)據(jù)成功,都是因?yàn)闆]有執(zhí)行到那里去就報(bào)異常了


    image.png
  • 在InsertUsers方法中镜硕,把異常代碼行放到insert語句之后运翼,調(diào)用InsertCuser方法之前;程序運(yùn)行結(jié)果是InsertUsers插入數(shù)據(jù)成功因?yàn)镮nsertUsers沒有納入事務(wù)的管理兴枯,InsertCuser插入數(shù)據(jù)失敗因?yàn)闆]有執(zhí)行到那里去


    image.png
  • 在InsertUsers方法中血淌,把異常代碼行放到調(diào)用InsertCuser方法之后;此時(shí)程序的運(yùn)行結(jié)果是:InsertUsers插入數(shù)據(jù)成功,因?yàn)镮nsertUsers沒有納入事務(wù)的管理悠夯。InsertCuser插入數(shù)據(jù)也成功癌淮,這里可能很多人不理解,因?yàn)檫@個(gè)int i =1/0 引發(fā)的運(yùn)行時(shí)異常只在本方法中會(huì)影響回滾沦补,也就是說它無法影響已經(jīng)執(zhí)行完畢提交的InsertCuser方法中的事務(wù)

    image.png

情況二:
無論將int i =1/0放InsertCuser方法塊中的哪里乳蓄,結(jié)果都是一樣的。
InsertUsers方法插入數(shù)據(jù)成功夕膀,因?yàn)樗辉谑聞?wù)之內(nèi)虚倒。InsertCuser方法插入數(shù)據(jù)失敗,因?yàn)閽伋霎惓J聞?wù)回滾

大總結(jié)

A方法調(diào)用B方法店诗;這里的上指的是調(diào)用者裹刮,下指的是被調(diào)用者

  • 異常總是向上拋出庞瘸,B方法會(huì)將異常拋出到A方法
  • 事務(wù)總是伴隨著異常的拋出而回滾捧弃,而且B方法事務(wù)如果進(jìn)行拋出會(huì)影響到A方法的事務(wù)。 方法中如果將異常拋出給上層調(diào)用者方法擦囊,那么當(dāng)前方法的事務(wù)會(huì)回滾 像除0異常這種運(yùn)行時(shí)異常是隱式拋出的不用管违霞、受檢異常就必須顯式拋出,本方法的事務(wù)才會(huì)回滾
  • 事務(wù)總是向下傳播瞬场,A方法中有事務(wù)买鸽,B方法中沒事務(wù)。A方法可能會(huì)將事務(wù)傳播給B方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贯被,一起剝皮案震驚了整個(gè)濱河市眼五,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彤灶,老刑警劉巖看幼,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幌陕,居然都是意外死亡诵姜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門搏熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棚唆,“玉大人,你說我怎么就攤上這事心例∠瑁” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵止后,是天一觀的道長(zhǎng)摆寄。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么微饥? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任逗扒,我火速辦了婚禮,結(jié)果婚禮上欠橘,老公的妹妹穿的比我還像新娘矩肩。我一直安慰自己,他們只是感情好肃续,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布黍檩。 她就那樣靜靜地躺著,像睡著了一般始锚。 火紅的嫁衣襯著肌膚如雪刽酱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天瞧捌,我揣著相機(jī)與錄音棵里,去河邊找鬼。 笑死姐呐,一個(gè)胖子當(dāng)著我的面吹牛殿怜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曙砂,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼头谜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鸠澈?” 一聲冷哼從身側(cè)響起柱告,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笑陈,沒想到半個(gè)月后末荐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碱鳞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勃黍。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖娜氏,靈堂內(nèi)的尸體忽然破棺而出拳缠,到底是詐尸還是另有隱情,我是刑警寧澤贸弥,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布窟坐,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哲鸳。R本人自食惡果不足惜臣疑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望徙菠。 院中可真熱鬧讯沈,春花似錦、人聲如沸婿奔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萍摊。三九已至挤茄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冰木,已是汗流浹背穷劈。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留片酝,地道東北人囚衔。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像雕沿,于是被迫代替她去往敵國(guó)和親练湿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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