Denis's Java Library

          The only documentation is the code itself

          對spring事務(wù)類型詳解的一點補充(關(guān)于嵌套事務(wù))

        1. PROPAGATION_REQUIRED--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就新建一個事務(wù)。這是最常見的選擇。
        2. PROPAGATION_SUPPORTS--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就以非事務(wù)方式執(zhí)行。
        3. PROPAGATION_MANDATORY--支持當(dāng)前事務(wù),如果當(dāng)前沒有事務(wù),就拋出異常。
        4. PROPAGATION_REQUIRES_NEW--新建事務(wù),如果當(dāng)前存在事務(wù),把當(dāng)前事務(wù)掛起。
        5. PROPAGATION_NOT_SUPPORTED--以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
        6. PROPAGATION_NEVER--以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。

          可能大家對PROPAGATION_NESTED還不怎么了解,覺得有必要再補充一下^_^!
           PROPAGATION_NESTED: 嵌套事務(wù)類型,是相對上面提到的六種情況(上面的六種應(yīng)該稱為平面事務(wù)類型),打個比方我現(xiàn)在有一個事務(wù)主要有一下幾部分:
          1,從A用戶帳戶里面減去100元錢
          2,往B用戶帳戶里面添加100元錢

          這樣看和以前不同的事務(wù)可能沒有什么區(qū)別,那我現(xiàn)在有點特殊的要求就是,A用戶有3個帳戶,B用戶有2個帳戶,現(xiàn)在我的要求就是只要再A用戶的3個帳戶里面任意一個減去100元,往B用戶的兩個帳戶中任意一個里面增加100元就可以了!

          一旦你有這樣的要求那嵌套事務(wù)類型就非常適合你!我們可以這樣理解,

          一:將“從A用戶帳戶里面減去100元錢” 和 “往B用戶帳戶里面增加100元錢”我們暫時認(rèn)為是一級事務(wù)操作

          二:將從A用戶的3個帳戶的任意一個帳戶里面減錢看做是“從A用戶帳戶里面減去100元錢”這個一級事務(wù)的子事務(wù)(二級事務(wù)),同樣把后面存錢的看成是另一個的二級事務(wù)。

          問題一:當(dāng)二級事務(wù)被rollback一級事務(wù)會不會被rollback?

          答案是不會的,二級事務(wù)的rollback只針對自己。

          問題二:什么時候這個一級事務(wù)會commit,什么時候會被rollback呢?

          我們主要看二級里面出現(xiàn)的情況,當(dāng)所有的二級事務(wù)被commit了并且一級事務(wù)沒有失敗的操作,那整個事務(wù)就算是一個成功的事務(wù),這種情況整個事務(wù)會被commit。

          當(dāng)任意一個二級事務(wù)沒有被commit那整個事務(wù)就是失敗的,整個事務(wù)會被roolback。

          還是拿上面的例子來說明吧!如果我在a的三個帳戶里面減錢的操作都被二級事務(wù)給rollback了,也就是3個帳戶里面都沒有減錢成功,整個事務(wù)就失敗了就會被rollback。如果A用戶帳戶三個帳戶里面有一個可以扣錢而且B用戶的兩個帳戶里面也有一個帳戶可以增加錢,那整個事務(wù)就算成功的,會被 commit。

          看了一下覺得上面的例子好像不是很深刻,看這個情況(A用戶的3個帳戶都是有信用額度的,也就是說可以超支,但是超支有金額限制)。不過原理是一樣的,簡單點也好說明一點,祝你好運!^_^
        7. posted on 2005-12-19 16:02 DenisLing 閱讀(3223) 評論(5)  編輯  收藏

          評論

          # re: 對spring事務(wù)類型詳解的一點補充(關(guān)于嵌套事務(wù)) 2005-12-28 14:08 chunjie

          答案是不會的,二級事務(wù)的rollback只針對自己。
          ------------------------------------------------
          但你下文中也說了:二級事務(wù)的rollback最終會使整個事務(wù)rollback啊. 該怎么理解你上面這句話?

            回復(fù)  更多評論   

          # re: 對spring事務(wù)類型詳解的一點補充(關(guān)于嵌套事務(wù)) 2005-12-28 14:11 chunjie

          如你的例子, 在兩個二級事務(wù)中, 若取錢的成功了,而在存入的時候rollback了,這時整個transaction會被rollback,如此,在取錢這個二級的會被rollback嗎?

          回答若'Y', 這和放在一個事務(wù)中有啥區(qū)別呢?   回復(fù)  更多評論   

          # re: 對spring事務(wù)類型詳解的一點補充(關(guān)于嵌套事務(wù)) 2005-12-28 22:19 DenisLing

          上面的朋友可能沒有理解我的意思!我的例子可能有點問題!
          其實這有一個經(jīng)典的旅行定票的問題!

          比如我要到臺灣旅游,我可能要如下去做
          1,買到上海的汽車票,
          2,在上海買去香港的飛機票,
          3,在香港買去臺灣的飛機票,
          4,買到目的旅游地的汽車票。

          ok!現(xiàn)在就討論上面的問題,如果把整個過程看成是一個完成的事務(wù),在以前的六種事務(wù)模型里面比如在第4步的時候沒有能夠買到到目的旅游地的汽車票,整個事務(wù)會回滾。
          但是我們可能在第4步的時候還可以選擇做地鐵或打的等等。這也就是嵌套事務(wù)類型和上面的不同地方,可以把1,2,3,4分別看成是一個子事務(wù),比如1的時候我沒有買到汽車票,可能我這個買汽車票的事務(wù)會回滾,但是這并步影響外面的事務(wù),可們可以選擇做火車等等其它途徑。如果1最后沒有能夠提交事務(wù),那么總的事務(wù)會回滾,(但是在1事務(wù)回滾的時候并不會導(dǎo)致外層事務(wù)回滾)。其他幾步都是一樣的道理。

          不知道這個例子是否明白點!有問題我們再討論!  回復(fù)  更多評論   

          # re: 對spring事務(wù)類型詳解的一點補充(關(guān)于嵌套事務(wù)) 2007-06-29 01:18 javafox

          上面的說法完全看不懂 就本人的理解在SRING默認(rèn)的回滾規(guī)則下 在2級事務(wù)中如果回滾了數(shù)據(jù)但是沒有拋出異常 1級事務(wù)還是回繼續(xù)執(zhí)行后面的2級事務(wù) 如果2級事務(wù)在回滾過程中拋出了異常 那么1級事務(wù)也馬上回滾 但是如果前面的2級事務(wù)如果已經(jīng)提交了 那么就算后面的2級事務(wù)回滾并拋出異常也只會導(dǎo)致1級事務(wù)回滾 前面已經(jīng)提交的2級事務(wù)不能回滾了 (因為就我知道的程序是不能回滾已經(jīng)提交的 只能通過數(shù)據(jù)庫系統(tǒng)日志恢復(fù)了)   回復(fù)  更多評論   

          # re: 對spring事務(wù)類型詳解的一點補充(關(guān)于嵌套事務(wù))[未登錄] 2009-05-12 14:35 spring

          @javafox

          你兩說的好像是一樣的  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 绩溪县| 维西| 额尔古纳市| 马龙县| 东乌珠穆沁旗| 游戏| 公主岭市| 沂南县| 贵溪市| 谷城县| 老河口市| 河南省| 东乡族自治县| 石河子市| 江达县| 临沭县| 千阳县| 古田县| 北辰区| 平南县| 视频| 射阳县| 武隆县| 临沧市| 金坛市| 桂东县| 化隆| 尚志市| 宜春市| 留坝县| 纳雍县| 墨脱县| 南木林县| 施甸县| 子洲县| 河南省| 宝应县| 宽甸| 永平县| 莱州市| 天台县|