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

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

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

    David.Turing's blog

     

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

    目前,似乎很少有支持嵌套事務的中間件,但嵌套事務確實存在。
    假定有Method A, Method B, Method C
    A 調用 B,C
    ServiceHost?{????
    ????????
    ????
    /**???
    ?????*?事務屬性配置為?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?{????
    ????????
    ????
    /**???
    ?????*?事務屬性配置為?PROPAGATION_NESTED,?
    ?????×?即該事務需要被嵌套???
    ?????
    */?????
    ????
    void?methodA()?{????
    ????}????
    ????????
    }

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

    ?

    術語上,ServiceA, B, C, D, E, F的事務均是ServiceParent事務的子事務,現在,是ServiceParent嵌套ServiceA-F,且嵌套事務的幾個特性如下:

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

    2,? 若子事務(ServiceA)被提交了,此時父事務則能夠看到子事務做出的任何修改,這些修改,對其他子事務來說是隱藏的,直到父事務提交為止。

    3,? 同樣地,如果被嵌套的事務ServiceA被回滾了,則它也不會對父事務有任何影響,且父事務servieParent也不會看到ServiceA曾經修改過的數據。

    4,? 最終父事務提交、回滾才會決定到子事務的提交、回滾。表達的形象點,若ServiceA“提交”后,ServiceParent卻因為Service B/C/D都無法成功執行,ServiceA會回滾。這種做法依賴于JDBC 3.0 SavePoint技術。

    5,? 嵌套子事務提交后,它對DB的鎖其實并沒有釋放,這些鎖的控制權被轉交給父事務,直到父事務提交(或回滾)后,鎖才會真正釋放

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

    ?

    ?

    ???????????

    ??????現在,我們略略了解一下JDBC SavePoint技術,它給予了我們這樣的能力,在一個事務里面,我們能夠將已經提交的事務狀態,恢復到一個事務commit以前的任意定點(這個點就是SavePoint)

    ??????????? 舉個例子,假設我們面臨這樣一種情況,methodA是運算代價非常大的事務操作,methodB, methodC都是輕量級的事務,我們需要執行這樣一個事務Tx={methodA->methodB->methodC}

    ?????????? 沒有SavePoint之前,如果methodA執行成功,但是恰恰methodB失敗了,那么methodA所有成果必須回滾,methodC也別想執行了,因為methodAmethodBmethodC都在同一個Tx事務中;JDBC3.0SavePoint技術為我們提供了一個無需回滾MethodA的折衷辦法,可以讓我們在保留methodA的成果的同時,僅僅回滾methodB,然后繼續執行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 閱讀(10279) 評論(4)  編輯  收藏 所屬分類: Java日積月累

    評論

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

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

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

    麻煩大大給個confluence破解包的解壓密碼
    toughwhite@gmail.com 謝謝!!!!  回復  更多評論   

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

    數據庫本質上從來沒有過嵌套事務的概念,只是應用程序為了不同的目的將對事務的操作過程嵌套起來,即使是Oracle的自治事務也可劃為應用程序(存儲過程或是觸發器什么的),, 從應用角度講,嵌套事務處理就是應用程序如何將應用層面的嵌套轉變為數據庫層面的單事務操作, 這方面Java領域的EJB,Spring提供了方面的解決方案,另外提一下JTA,它提供了事務的suspend,resume功能,實質上其實數據庫事務那里有什么掛起什么的概念,其僅僅是換了一個數據庫連接,這樣新的數據庫事務開始了,老的數據庫事務便不再操作,直接其被resume.  回復  更多評論   

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

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

    "要么一起成功,要么一起失敗"這肯定沒有問題 ,關鍵是事務結束只有兩個可能, commit,rollback,故save point只是事務中間的一個小玩意,跟事務完整性無任何關系.  回復  更多評論   

    導航

    統計

    常用鏈接

    留言簿(110)

    我參與的團隊

    隨筆分類(126)

    隨筆檔案(155)

    文章分類(9)

    文章檔案(19)

    相冊

    搜索

    積分與排名

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲免费福利在线视频| 最近免费mv在线电影| 四色在线精品免费观看| 亚洲videos| 成人免费视频88| 亚洲国产AV一区二区三区四区| 日韩不卡免费视频| 亚洲成年网站在线观看| 午夜老司机免费视频| 国产天堂亚洲精品| 亚洲第一黄色网址| 免费观看一区二区三区| 亚洲av永久无码精品网站| 麻豆成人久久精品二区三区免费| 亚洲国产综合专区电影在线| 最近免费中文字幕高清大全| 亚洲伊人久久大香线蕉结合| 最近免费中文字幕大全| 国产精品亚洲综合一区在线观看| 亚洲一级特黄大片无码毛片| 免费a级毛片无码a∨免费软件| 一区二区三区亚洲| 天天干在线免费视频| 免费无遮挡无遮羞在线看| 亚洲熟妇丰满多毛XXXX| 无码少妇精品一区二区免费动态| 亚洲人成免费网站| 国产免费人成在线视频| A级毛片高清免费视频在线播放| 67pao强力打造67194在线午夜亚洲| 91精品国产免费久久久久久青草| 亚洲色成人网站WWW永久四虎 | 一级毛片a女人刺激视频免费| 亚洲线精品一区二区三区影音先锋| 日本免费一区二区三区四区五六区| 国产精品亚洲自在线播放页码| 国产伦精品一区二区三区免费迷| 成人精品视频99在线观看免费| 亚洲高清在线mv| 无码专区一va亚洲v专区在线 | 亚洲va在线va天堂va888www|