如何理解嵌套事務(Nested Transaction)
目前,似乎很少有支持嵌套事務的中間件,但嵌套事務確實存在。假定有Method A, Method B, Method C
A 調用 B,C
????????
????/**???
?????*?事務屬性配置為?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()
??????}
????}????
???
}?
????????
????/**???
?????*?事務屬性配置為?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-E,A-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也別想執行了,因為methodA、methodB、methodC都在同一個Tx事務中;JDBC3.0的SavePoint技術為我們提供了一個無需回滾MethodA的折衷辦法,可以讓我們在保留methodA的成果的同時,僅僅回滾methodB,然后繼續執行methodC。
????? 回滾到SavePoint的代碼類似于:














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