關于二階段事務2PC

XA規(guī)范

X/Open?組織(即現(xiàn)在的?Open?Group?)定義了分布式事務處理模型。?X/Open?DTP?模型(?1994?)包括應用程序(?AP?)、事務管理器(?TM?)、資源管理器(?RM?)、通信資源管理器(?CRM?)四部分。一般,常見的事務管理器(?TM?)是交易中間件,常見的資源管理器(?RM?)是數(shù)據(jù)庫,常見的通信資源管理器(?CRM?)是消息中間件。? ??通常把一個數(shù)據(jù)庫內(nèi)部的事務處理,如對多個表的操作,作為本地事務看待。數(shù)據(jù)庫的事務處理對象是本地事務,而分布式事務處理的對象是全局事務。?? 所謂全局事務,是指分布式事務處理環(huán)境中,多個數(shù)據(jù)庫可能需要共同完成一個工作,這個工作即是一個全局事務,例如,一個事務中可能更新幾個不同的數(shù)據(jù)庫。對數(shù)據(jù)庫的操作發(fā)生在系統(tǒng)的各處但必須全部被提交或回滾。此時一個數(shù)據(jù)庫對自己內(nèi)部所做操作的提交不僅依賴本身操作是否成功,還要依賴與全局事務相關的其它數(shù)據(jù)庫的操作是否成功,如果任一數(shù)據(jù)庫的任一操作失敗,則參與此事務的所有數(shù)據(jù)庫所做的所有操作都必須回滾。?? ??一般情況下,某一數(shù)據(jù)庫無法知道其它數(shù)據(jù)庫在做什么,因此,在一個?DTP?環(huán)境中,交易中間件是必需的,由它通知和協(xié)調(diào)相關數(shù)據(jù)庫的提交或回滾。而一個數(shù)據(jù)庫只將其自己所做的操作(可恢復)影射到全局事務中。????

XA?就是?X/Open?DTP?定義的交易中間件與數(shù)據(jù)庫之間的接口規(guī)范(即接口函數(shù)),交易中間件用它來通知數(shù)據(jù)庫事務的開始、結(jié)束以及提交、回滾等。?XA?接口函數(shù)由數(shù)據(jù)庫廠商提供。?

二階提交協(xié)議和三階提交協(xié)議就是根據(jù)這一思想衍生出來的??梢哉f二階段提交其實就是實現(xiàn)XA分布式事務的關鍵(確切地說:兩階段提交主要保證了分布式事務的原子性:即所有結(jié)點要么全做要么全不做)

2PC

二階段提交(Two-phaseCommit)是指,在計算機網(wǎng)絡以及數(shù)據(jù)庫領域內(nèi),為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點在進行事務提交時保持一致性而設計的一種算法(Algorithm)。通常,二階段提交也被稱為是一種協(xié)議(Protocol))。在分布式系統(tǒng)中,每個節(jié)點雖然可以知曉自己的操作時成功或者失敗,卻無法知道其他節(jié)點的操作的成功或失敗。當一個事務跨越多個節(jié)點時,為了保持事務的ACID特性,需要引入一個作為協(xié)調(diào)者的組件來統(tǒng)一掌控所有節(jié)點(稱作參與者)的操作結(jié)果并最終指示這些節(jié)點是否要把操作結(jié)果進行真正的提交(比如將更新后的數(shù)據(jù)寫入磁盤等等)。因此,二階段提交的算法思路可以概括為:參與者將操作成敗通知協(xié)調(diào)者,再由協(xié)調(diào)者根據(jù)所有參與者的反饋情報決定各參與者是否要提交操作還是中止操作。

所謂的兩個階段是指:第一階段:準備階段(投票階段)和第二階段:提交階段(執(zhí)行階段)。

準備階段

事務協(xié)調(diào)者(事務管理器)給每個參與者(資源管理器)發(fā)送Prepare消息,每個參與者要么直接返回失敗(如權(quán)限驗證失敗),要么在本地執(zhí)行事務,寫本地的redo和undo日志,但不提交,到達一種“萬事俱備,只欠東風”的狀態(tài)。

可以進一步將準備階段分為以下三個步驟:

1)協(xié)調(diào)者節(jié)點向所有參與者節(jié)點詢問是否可以執(zhí)行提交操作(vote),并開始等待各參與者節(jié)點的響應。

2)參與者節(jié)點執(zhí)行詢問發(fā)起為止的所有事務操作,并將Undo信息和Redo信息寫入日志。(注意:若成功這里其實每個參與者已經(jīng)執(zhí)行了事務操作)

3)各參與者節(jié)點響應協(xié)調(diào)者節(jié)點發(fā)起的詢問。如果參與者節(jié)點的事務操作實際執(zhí)行成功,則它返回一個”同意”消息;如果參與者節(jié)點的事務操作實際執(zhí)行失敗,則它返回一個”中止”消息。

提交階段

如果協(xié)調(diào)者收到了參與者的失敗消息或者超時,直接給每個參與者發(fā)送回滾(Rollback)消息;否則,發(fā)送提交(Commit)消息;參與者根據(jù)協(xié)調(diào)者的指令執(zhí)行提交或者回滾操作,釋放所有事務處理過程中使用的鎖資源。(注意:必須在最后階段釋放鎖資源)

接下來分兩種情況分別討論提交階段的過程。

當協(xié)調(diào)者節(jié)點從所有參與者節(jié)點獲得的相應消息都為”同意”時:

1)協(xié)調(diào)者節(jié)點向所有參與者節(jié)點發(fā)出”正式提交(commit)”的請求。

2)參與者節(jié)點正式完成操作,并釋放在整個事務期間內(nèi)占用的資源。

3)參與者節(jié)點向協(xié)調(diào)者節(jié)點發(fā)送”完成”消息。

4)協(xié)調(diào)者節(jié)點受到所有參與者節(jié)點反饋的”完成”消息后,完成事務。

如果任一參與者節(jié)點在第一階段返回的響應消息為”中止”,或者 協(xié)調(diào)者節(jié)點在第一階段的詢問超時之前無法獲取所有參與者節(jié)點的響應消息時:

1)協(xié)調(diào)者節(jié)點向所有參與者節(jié)點發(fā)出”回滾操作(rollback)”的請求。

2)參與者節(jié)點利用之前寫入的Undo信息執(zhí)行回滾,并釋放在整個事務期間內(nèi)占用的資源。

3)參與者節(jié)點向協(xié)調(diào)者節(jié)點發(fā)送”回滾完成”消息。

4)協(xié)調(diào)者節(jié)點受到所有參與者節(jié)點反饋的”回滾完成”消息后,取消事務。

  不管最后結(jié)果如何,第二階段都會結(jié)束當前事務。

二階段提交看起來確實能夠提供原子性的操作,但是二階段提交還是有幾個缺點的:

1、同步阻塞問題。執(zhí)行過程中,所有參與節(jié)點都是事務阻塞型的。當參與者占有公共資源時,其他第三方節(jié)點訪問公共資源不得不處于阻塞狀態(tài)。

2、單點故障。由于協(xié)調(diào)者的重要性,一旦協(xié)調(diào)者發(fā)生故障。參與者會一直阻塞下去。尤其在第二階段,協(xié)調(diào)者發(fā)生故障,那么所有的參與者還都處于鎖定事務資源的狀態(tài)中,而無法繼續(xù)完成事務操作。(如果是協(xié)調(diào)者掛掉,可以重新選舉一個協(xié)調(diào)者,但是無法解決因為協(xié)調(diào)者宕機導致的參與者處于阻塞狀態(tài)的問題)

3、數(shù)據(jù)不一致。在二階段提交的階段二中,當協(xié)調(diào)者向參與者發(fā)送commit請求之后,發(fā)生了局部網(wǎng)絡異?;蛘咴诎l(fā)送commit請求過程中協(xié)調(diào)者發(fā)生了故障,這回導致只有一部分參與者接受到了commit請求。而在這部分參與者接到commit請求之后就會執(zhí)行commit操作。但是其他部分未接到commit請求的機器則無法執(zhí)行事務提交。于是整個分布式系統(tǒng)便出現(xiàn)了數(shù)據(jù)不一致的現(xiàn)象。

4、二階段無法解決的問題:協(xié)調(diào)者再發(fā)出commit消息之后宕機,而唯一接收到這條消息的參與者同時也宕機了。那么即使協(xié)調(diào)者通過選舉協(xié)議產(chǎn)生了新的協(xié)調(diào)者,這條事務的狀態(tài)也是不確定的,沒人知道事務是否被已經(jīng)提交。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容