天天看點

分布式事務(兩階段送出)模型詳解

這一幾天一直在回顧事務相關的知識,也準備把以前了解皮毛的知識進行一些深入總結,雖然這一些知識并沒有用到,但是了解其實作原理還是很有必要的,因為知道了原理,你也能把它實作出來。

在上一節事務的程式設計模型裡面,主要說明了三種程式設計模型,一般情況下,我們都接觸的是單一資源的事務,也就是單獨對一個資料庫進行操作。如果需要跨多個資源保證事務一緻性

舉個例子:在atm機取錢的時候,需要對使用者的賬戶進行扣款處理,然後發送一條消息給消息伺服器(假設消息伺服器是用jms實作的),由消息伺服器異步通過短信通知使用者。如果使用者取款失敗,那麼消息伺服器不應該發送短信給使用者。如何保證 使用者帳務扣款 和 消息伺服器的消息保持一緻性,也就是說 取款成功,消息伺服器就持久化消息,然後發送短信給使用者,取款失敗,消息伺服器就復原消息,啥都不做。

在上面這種情況下,就需要使用分布式事務,也就是跨越多個資源的保證資料一緻性。

x/open dtp(x/open distributed transaction processing reference model) 是x/open 這個組織定義的一套分布式事務的标準,也就是了定義了規範和api接口,由這個廠商進行具體的實作。這個思想在java 平台裡面到處都是。

x/open dtp 定義了三個元件: ap,tm,rm

ap(application program):也就是應用程式,可以了解為使用dtp的程式

rm(resource manager):資料總管,這裡可以了解為一個dbms系統,或者消息伺服器管理系統,應用程式通過資料總管對資源進行控制。資源必須實作xa定義的接口

tm(transaction manager):事務管理器,負責協調和管理事務,提供給ap應用程式程式設計接口以及管理資料總管

其中,ap 可以和tm 以及 rm 通信,tm 和 rm 互相之間可以通信,dtp模型裡面定義了xa接口,tm 和 rm 通過xa接口進行雙向通信,例如:tm通知rm送出事務或者復原事務,rm把送出結果通知給tm。ap和rm之間則通過rm提供的native api 進行資源控制,這個沒有進行約api和規範,各個廠商自己實作自己的資源控制,比如oracle自己的資料庫驅動程式。

下面一幅圖說明了三者的關系:

分布式事務(兩階段送出)模型詳解

其中在dtp定了以下幾個概念:

事務:一個事務是一個完整的工作單元,由多個獨立的計算任務組成,這多個任務在邏輯上是原子的。

全局事務:對于一次性操作多個資料總管的事務,就是全局事務

分支事務:在全局事務中,某一個資料總管有自己獨立的任務,這些任務的集合作為這個資料總管的分支任務

控制線程:用來表示一個工作線程,主要是關聯ap,tm,rm三者的一個線程,也就是事務上下文環境。簡單的說,就是需要辨別一個全局事務以及分支事務的關系。

第一階段:準備階段

事務管理器通知資料總管準備分支事務,資料總管告之事務管理器準備結果

第二階段:送出階段

事務管理器通知資料總管送出分支事務,資料總管告之事務管理器結果

下面一幅圖示範了正常情況下的兩階段送出,

分布式事務(兩階段送出)模型詳解

如果第一階段某一個資源預送出失敗,第二階段就復原第一階段已經預送出成功的資源

分布式事務(兩階段送出)模型詳解

 以上是比較正常的情況,但是由于rm有權利自己根據情況送出或者復原自己的分支事務(官方說法是:heuristic decision)那三麼就可能出現以下種情況:

1 在tm通知rm送出事務之前,rm分支事務已經送出

分布式事務(兩階段送出)模型詳解

2 在tm通知rm送出事務之前,rm分支事務全部復原

分布式事務(兩階段送出)模型詳解

3 在tm通知rm送出事務之前,rm分支事務部分復原

分布式事務(兩階段送出)模型詳解

對于heuristic decision标記的分支事務,在沒有tm通知rm forget 它之前,rm都必須儲存分支事務的資訊,等到tm從失敗中恢複事務之後,通知rm forget 分支事務,這個時候rm才真正的完成事務。

對于前面兩種情況來說,tm會比較好處理,做事務恢複的時候,要麼标記全局事務成功,要麼标記全局事務復原,通知rm可以完成分支事務了。對于第三種情況,可能就需要進行決策了,這個具體怎麼處理,貌似dtp并沒有說明細節,可以交給應用自己去判斷。

dtp程式設計模型

雖然dtp内部的實作比較複雜,但是對于dtp程式設計模型就比較簡單了

1 ap通過tm擷取事務

2 ap申明需要哪些rm,tm注冊rm

3 ap使用rm完成分支事務

4 ap通過tm送出事務

5 tm通知rm送出事務

而dtp的服務的實作就需要考慮以下幾個問題:

如何擷取tm?

如何啟動和結束一個事務

如何辨別一個事務

如何儲存和傳遞事務上下文

應用如何通過資料總管操作共享資源

資料總管如何實作準備階段以及與送出階段的邏輯

如何實作兩階段送出協定

如何實作在異常情況下進行事務恢複

其實如果把這幾個問題了解清楚了,就可以自己實作一個兩階段送出的分布式事務模型了。

轉自:http://www.cnblogs.com/aigongsi/archive/2012/10/11/2718313.html

特别說明:尊重作者的勞動成果,轉載請注明出處哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt369

繼續閱讀