互動科技 快樂分享 X/Open DTP——分散式事務模型
這一幾天一直在回顧事務相關的知識,也準備把以前瞭解皮毛的知識進行一些深入總結,雖然這一些知識並沒有用到,但是瞭解其實現原理還是很有必要的,因為知道了原理,你也能把它實現出來。
在上一節事務的程式設計模型裡面,主要說明了三種程式設計模型,一般情況下,我們都接觸的是單一資源的事務,也就是單獨對一個數據庫進行操作。如果需要跨多個資源保證事務一致性
舉個例子:在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三者的一個執行緒,也就是事務上下文環境。簡單的說,就是需要標識一個全域性事務以及分支事務的關係。
兩階段提交協議:如果一個事務管理器管理著多個資源管理器,如果控制全域性事務和分支事務,在DTP裡面說明兩階段提交的協議
第一階段:準備階段
事務管理器通知資源管理器準備分支事務,資源管理器告之事務管理器準備結果
第二階段:提交階段
事務管理器通知資源管理器提交分支事務,資源管理器告之事務管理器結果
下面一幅圖演示了正常情況下的兩階段提交,
如果第一階段某一個資源預提交失敗,第二階段就回滾第一階段已經預提交成功的資源
以上是比較正常的情況,但是由於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?
- 如何啟動和結束一個事務
- 如何標識一個事務
- 如何儲存和傳遞事務上下文
- 應用如何通過資源管理器操作共享資源
- 資源管理器如何實現準備階段以及與提交階段的邏輯
- 如何實現兩階段提交協議
- 如何實現在異常情況下進行事務恢復
其實如果把這幾個問題了解清楚了,就可以自己實現一個兩階段提交的分散式事務模型了。