三階段提交(Three-phase commit)

AskHarries發表於2018-05-23

一、什麼是三階段提交協議?

三階段提交(Three-phase commit),也叫三階段提交協議(Three-phase commit protocol),是二階段提交(2PC)的改進版本。

與兩階段提交不同的是,三階段提交有兩個改動點。

1、引入超時機制。同時在協調者和參與者中都引入超時機制。
2、在第一階段和第二階段中插入一個準備階段。保證了在最後提交階段之前各參與節點的狀態是一致的。

也就是說,除了引入超時機制之外,3PC把2PC的準備階段再次一分為二,這樣三階段提交就有CanCommitPreCommitDoCommit三個階段。

二、三階段提交協議互動過程描述

三階段提交協議在協調者和參與者中都引入超時機制,並且把兩階段提交協議的第一個階段拆分成了兩步:詢問,然後再鎖資源,最後真正提交。

(1)三個階段的執行
1.CanCommit階段
3PC的CanCommit階段其實和2PC的準備階段很像。
協調者向參與者傳送commit請求,參與者如果可以提交就返回Yes響應,否則返回No響應。

2.PreCommit階段
Coordinator根據Cohort的反應情況來決定是否可以繼續事務的PreCommit操作。
根據響應情況,有以下兩種可能。
A.假如Coordinator從所有的Cohort獲得的反饋都是Yes響應,那麼就會進行事務的預執行:
傳送預提交請求。Coordinator向Cohort傳送PreCommit請求,並進入Prepared階段。
事務預提交。Cohort接收到PreCommit請求後,會執行事務操作,並將undo和redo資訊記錄到事務日誌中。
響應反饋。如果Cohort成功的執行了事務操作,則返回ACK響應,同時開始等待最終指令。

B.假如有任何一個Cohort向Coordinator傳送了No響應,或者等待超時之後,Coordinator都沒有接到Cohort的響應,那麼就中斷事務:
傳送中斷請求。Coordinator向所有Cohort傳送abort請求。
中斷事務。Cohort收到來自Coordinator的abort請求之後(或超時之後,仍未收到Cohort的請求),執行事務的中斷。

3.DoCommit階段

該階段進行真正的事務提交,也可以分為以下兩種情況:

執行提交

A.傳送提交請求。Coordinator接收到Cohort傳送的ACK響應,那麼他將從預提交狀態進入到提交狀態。並向所有Cohort傳送doCommit請求。
B.事務提交。Cohort接收到doCommit請求之後,執行正式的事務提交。並在完成事務提交之後釋放所有事務資源。
C.響應反饋。事務提交完之後,向Coordinator傳送ACK響應。
D.完成事務。Coordinator接收到所有Cohort的ACK響應之後,完成事務。

中斷事務

Coordinator沒有接收到Cohort傳送的ACK響應(可能是接受者傳送的不是ACK響應,也可能響應超時),那麼就會執行中斷事務。

(2)三階段提交協議和兩階段提交協議的不同

對於協調者(Coordinator)和參與者(Cohort)都設定了超時機制(在2PC中,只有協調者擁有超時機制,即如果在一定時間內沒有收到cohort的訊息則預設失敗)。
在2PC的準備階段和提交階段之間,插入預提交階段,使3PC擁有CanCommit、PreCommit、DoCommit三個階段。
PreCommit是一個緩衝,保證了在最後提交階段之前各參與節點的狀態是一致的。

(2)三階段提交協議的缺點

如果進入PreCommit後,Coordinator發出的是abort請求,假設只有一個Cohort收到並進行了abort操作,
而其他對於系統狀態未知的Cohort會根據3PC選擇繼續Commit,此時系統狀態發生不一致性。

三階段提交(Three-phase commit)


相關文章