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 閱讀(10274) 評論(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)

          相冊

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桦川县| 峨眉山市| 拉萨市| 桦南县| 陵水| 惠东县| 闵行区| 石棉县| 延津县| 乐昌市| 天祝| 吉林省| 黎川县| 丽江市| 铜川市| 体育| 馆陶县| 连江县| 南陵县| 乌海市| 满城县| 托里县| 小金县| 博爱县| 垣曲县| 洪雅县| 铜鼓县| 双城市| 会泽县| 慈溪市| 北碚区| 闽侯县| 简阳市| 彩票| 汉寿县| 西安市| 天镇县| 乐平市| 镇安县| 科技| 莱州市|