<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    David.Turing's blog

     

    如何理解嵌套事務(wù)(Nested Transaction)

    目前,似乎很少有支持嵌套事務(wù)的中間件,但嵌套事務(wù)確實(shí)存在。
    假定有Method A, Method B, Method C
    A 調(diào)用 B,C
    ServiceHost?{????
    ????????
    ????
    /**???
    ?????*?事務(wù)屬性配置為?PROPAGATION_REQUIRED???
    ?????
    */???
    ????
    void?invoke()?{????
    ??????try{
    ???????????ServiceA.invoke()
    ??????}?
    catch?(Bussiness.A.Exception)?{?
    ?????????? abort()
    ??????}

    ????????
    try?{????
    ????????????ServiceB.invoke();????
    ????????}?
    catch?(Bussiness.B.Exception)?{????
    ????????????ServiceC.invoke();
    ????????}?
    catch?(Bussiness.C.Exception)?{????
    ????????????ServiceD.invoke();
    ????????} catch?(Bussiness.D.Exception)?{?
    ?????????? abort()
    ??????}

    ??
    ????????
    try{
    ???????????ServiceE.invoke()
    ????????}?
    catch?(Bussiness.E.Exception)?{?
    ???????????ServiceF.invoke()
    ????????}catch?(Bussiness.F.Exception)?{?
    ?????????? abort()
    ??????}


    ????}????
    ???
    }?

    ServiceA?{????
    ????????
    ????
    /**???
    ?????*?事務(wù)屬性配置為?PROPAGATION_NESTED,?
    ?????×?即該事務(wù)需要被嵌套???
    ?????
    */?????
    ????
    void?methodA()?{????
    ????}????
    ????????
    }

    ServiceA, ServiceB, ServiceC, ServiceD, ServiceE, ServiceF都配置為PROPAGATION_NESTED
    通過這樣的嵌套規(guī)約,我們可以滿足業(yè)務(wù)完整性的需求,一個(gè)ServiceParent?業(yè)務(wù),只允許出現(xiàn)A-B-E , A-B-F, A-C-E, A-C-F, A-D-EA-D-F的組合,其他組合,如A-B-C, A-E, B-F都是不允許的。

    ?

    術(shù)語(yǔ)上,ServiceA, B, C, D, E, F的事務(wù)均是ServiceParent事務(wù)的子事務(wù),現(xiàn)在,是ServiceParent嵌套ServiceA-F,且嵌套事務(wù)的幾個(gè)特性如下:

    1,? 假定子事務(wù)(ServiceA-F)處于活動(dòng)狀態(tài)(active),則parent事務(wù)(ServiceParent)不能執(zhí)行任何其他操作,父事務(wù)只能commit事務(wù),abort事務(wù)以及創(chuàng)建更多其它子事務(wù)。

    2,? 若子事務(wù)(ServiceA)被提交了,此時(shí)父事務(wù)則能夠看到子事務(wù)做出的任何修改,這些修改,對(duì)其他子事務(wù)來(lái)說(shuō)是隱藏的,直到父事務(wù)提交為止。

    3,? 同樣地,如果被嵌套的事務(wù)ServiceA被回滾了,則它也不會(huì)對(duì)父事務(wù)有任何影響,且父事務(wù)servieParent也不會(huì)看到ServiceA曾經(jīng)修改過的數(shù)據(jù)。

    4,? 最終父事務(wù)提交、回滾才會(huì)決定到子事務(wù)的提交、回滾。表達(dá)的形象點(diǎn),若ServiceA“提交”后,ServiceParent卻因?yàn)?/span>Service B/C/D都無(wú)法成功執(zhí)行,ServiceA會(huì)回滾。這種做法依賴于JDBC 3.0 SavePoint技術(shù)。

    5,? 嵌套子事務(wù)提交后,它對(duì)DB的鎖其實(shí)并沒有釋放,這些鎖的控制權(quán)被轉(zhuǎn)交給父事務(wù),直到父事務(wù)提交(或回滾)后,鎖才會(huì)真正釋放

    6,? 目前,嵌套的深度不收控制,也就是,我們可對(duì)method進(jìn)行以深度嵌套。

    ?

    ?

    ???????????

    ??????現(xiàn)在,我們略略了解一下JDBC SavePoint技術(shù),它給予了我們這樣的能力,在一個(gè)事務(wù)里面,我們能夠?qū)⒁呀?jīng)提交的事務(wù)狀態(tài),恢復(fù)到一個(gè)事務(wù)commit以前的任意定點(diǎn)(這個(gè)點(diǎn)就是SavePoint)

    ??????????? 舉個(gè)例子,假設(shè)我們面臨這樣一種情況,methodA是運(yùn)算代價(jià)非常大的事務(wù)操作,methodB, methodC都是輕量級(jí)的事務(wù),我們需要執(zhí)行這樣一個(gè)事務(wù)Tx={methodA->methodB->methodC}

    ?????????? 沒有SavePoint之前,如果methodA執(zhí)行成功,但是恰恰methodB失敗了,那么methodA所有成果必須回滾,methodC也別想執(zhí)行了,因?yàn)?/span>methodAmethodBmethodC都在同一個(gè)Tx事務(wù)中;JDBC3.0SavePoint技術(shù)為我們提供了一個(gè)無(wú)需回滾MethodA的折衷辦法,可以讓我們?cè)诒A?/span>methodA的成果的同時(shí),僅僅回滾methodB,然后繼續(xù)執(zhí)行methodC

    ????? 回滾到SavePoint的代碼類似于:

    Statement?stmt?=?conn.createStatement();
    int?rows?=?stmt.executeUpdate("INSERT?INTO?TAB1?(COL1)?VALUES?"?+
    "(’FIRST’)");
    //?set?savepoint
    Savepoint?svpt1?=?conn.setSavepoint("SAVEPOINT_1");
    rows?
    =?stmt.executeUpdate("INSERT?INTO?TAB1?(COL1)?"?+
    "VALUES?(’SECOND’)");

    conn.rollback(svpt1);

    conn.commit();

    posted on 2008-03-04 12:38 david.turing 閱讀(10285) 評(píng)論(4)  編輯  收藏 所屬分類: Java日積月累

    評(píng)論

    # re: 如何理解嵌套事務(wù)(Nested Transaction) 2008-03-17 23:32 天涯【鈍】刀客

    個(gè)人對(duì)事務(wù)的理解比較片面:要么一起成功,要么一起失敗,所接觸的用戶需求基本也都是這樣的,沒有出現(xiàn)要求部分成功/部分失敗的情況.
    了解savePoint的概念,但是不知道hibernate里面是否支持這個(gè)操作...,有空試試.嘿嘿.  回復(fù)  更多評(píng)論   

    # re: 如何理解嵌套事務(wù)(Nested Transaction) 2008-04-05 11:12 alucard

    麻煩大大給個(gè)confluence破解包的解壓密碼
    toughwhite@gmail.com 謝謝!!!!  回復(fù)  更多評(píng)論   

    # re: 如何理解嵌套事務(wù)(Nested Transaction) 2008-04-30 15:04 guest

    數(shù)據(jù)庫(kù)本質(zhì)上從來(lái)沒有過嵌套事務(wù)的概念,只是應(yīng)用程序?yàn)榱瞬煌哪康膶?duì)事務(wù)的操作過程嵌套起來(lái),即使是Oracle的自治事務(wù)也可劃為應(yīng)用程序(存儲(chǔ)過程或是觸發(fā)器什么的),, 從應(yīng)用角度講,嵌套事務(wù)處理就是應(yīng)用程序如何將應(yīng)用層面的嵌套轉(zhuǎn)變?yōu)閿?shù)據(jù)庫(kù)層面的單事務(wù)操作, 這方面Java領(lǐng)域的EJB,Spring提供了方面的解決方案,另外提一下JTA,它提供了事務(wù)的suspend,resume功能,實(shí)質(zhì)上其實(shí)數(shù)據(jù)庫(kù)事務(wù)那里有什么掛起什么的概念,其僅僅是換了一個(gè)數(shù)據(jù)庫(kù)連接,這樣新的數(shù)據(jù)庫(kù)事務(wù)開始了,老的數(shù)據(jù)庫(kù)事務(wù)便不再操作,直接其被resume.  回復(fù)  更多評(píng)論   

    # re: 如何理解嵌套事務(wù)(Nested Transaction) 2008-04-30 15:12 guest

    當(dāng)然Save point確實(shí)提供了事務(wù)部分回退的操作,這是數(shù)據(jù)庫(kù)層面提供的功能,JDBC3只是提供了支持而矣, 但是這本身還是線性的,沒有什么嵌套的概念.

    "要么一起成功,要么一起失敗"這肯定沒有問題 ,關(guān)鍵是事務(wù)結(jié)束只有兩個(gè)可能, commit,rollback,故save point只是事務(wù)中間的一個(gè)小玩意,跟事務(wù)完整性無(wú)任何關(guān)系.  回復(fù)  更多評(píng)論   

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(110)

    我參與的團(tuán)隊(duì)

    隨筆分類(126)

    隨筆檔案(155)

    文章分類(9)

    文章檔案(19)

    相冊(cè)

    搜索

    積分與排名

    最新隨筆

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 中文字字幕在线高清免费电影| 亚洲成AV人片在线观看无码| 在线视频免费国产成人| 国产一精品一AV一免费孕妇 | 亚洲网站在线免费观看| 国产亚洲综合久久系列| 亚洲爆乳无码专区| 国产av无码专区亚洲av桃花庵| 久久国产亚洲精品麻豆| 亚洲国产第一站精品蜜芽| 亚洲AV无码AV男人的天堂| 久久精品国产96精品亚洲| 久久亚洲国产成人精品性色| 91久久亚洲国产成人精品性色| 亚洲精品美女在线观看播放| 亚洲免费一级视频| 无码色偷偷亚洲国内自拍| 一个人看www免费高清字幕| 野花香高清视频在线观看免费| 精品无码无人网站免费视频| 在线观看成人免费视频不卡| 在线免费不卡视频| 亚洲国产综合精品一区在线播放| 亚洲精品无码专区久久久| 日韩精品亚洲人成在线观看| 中文字幕无码精品亚洲资源网久久 | 全黄a免费一级毛片人人爱| 国产福利电影一区二区三区,亚洲国模精品一区 | 久久永久免费人妻精品| 国产情侣激情在线视频免费看| 性感美女视频在线观看免费精品| 亚洲成A∨人片天堂网无码| 亚洲AV无码乱码在线观看裸奔| 亚洲一区精品视频在线| 国产成人精品亚洲一区| 91免费在线视频| 噼里啪啦电影在线观看免费高清| 亚洲国产成人久久一区WWW| 亚洲∧v久久久无码精品| 亚洲色偷偷综合亚洲AV伊人蜜桃| 国产精品亚洲一区二区三区在线观看 |