分布式事務(兩階段提交)模型詳解


詳見:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt369

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

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

舉個例子:在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?

  • 如何啟動和結束一個事務

  • 如何標識一個事務

  • 如何保存和傳遞事務上下文

  • 應用如何通過資源管理器操作共享資源

  • 資源管理器如何實現准備階段以及與提交階段的邏輯

  • 如何實現兩階段提交協議

  • 如何實現在異常情況下進行事務恢復

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM