一、協議概述
兩階段提交協議(two phase commit protocol,2PC)可以保證數據的強一致性,許多分布式關系型數據管理系統采用此協議來完成分布式事務。它是協調所有分布式原子事務參與者,並決定提交或取消(回滾)的分布式算法。同時也是解決一致性問題的一致性算法。該算法能夠解決很多的臨時性系統故障(包括進程、網絡節點、通信等故障),被廣泛地使用。但是,它並不能夠通過配置來解決所有的故障,在某些情況下它還需要人為的參與才能解決問題。參與者為了能夠從故障中恢復,它們都使用日志來記錄協議的狀態,雖然使用日志降低了性能但是節點能夠從故障中恢復。
在兩階段提交協議中,系統一般包含兩類機器(或節點):
①協調者coordinator,通常一個系統中只有一個;
②事務參與者 participants,cohorts或workers,一般包含多個;
在數據存儲系統中可以理解為數據副本的個數,協議中假設:
①每個節點都會記錄寫前日志並持久性存儲,即使節點發生故障日志也不會丟失;
②節點不會發生永久性故障而且任意兩個節點都可以互相通信;
當事務的最后一步完成之后,協調器執行協議,參與者根據本地事務,能夠成功完成回復同意提交事務或者回滾事務。
二、執行過程
顧名思義,兩階段提交協議由兩個階段組成。在正常的執行下,這兩個階段的執行過程如下所述:
(1)階段1:請求階段(commit-request phase,或稱表決階段,voting phase)
在請求階段,協調者將通知事務參與者准備提交或取消事務,然后進入表決過程。在表決過程中,參與者將告知協調者自己的決策:同意(事務參與者本地作業執行成功)或取消(本地作業執行故障)。
(2)階段2:提交階段(commit phase)
在該階段,協調者將基於第一個階段的投票結果進行決策:提交或取消。當且僅當所有的參與者同意提交事務協調者才通知所有的參與者提交事務,否則協調者將通知所有的參與者取消事務。參與者在接收到協調者發來的消息后將執行響應的操作。
注意 兩階段提交協議與兩階段鎖協議不同,兩階段鎖協議為一致性控制協議。
(3)該協議的執行過程可以通過下圖來描述:

(a)成功 (b)失敗
三、協議的特點
兩階段提交協議最大的劣勢是其通過阻塞完成的協議,在節點等待消息的時候處於阻塞狀態,節點中其他進程則需要等待阻塞進程釋放資源才能使用。如果協調器發生了故障,那么參與者將無法完成事務則一直等待下去。以下情況可能會導致節點發生永久阻塞:
(1)如果參與者發送同意提交消息給協調者,進程將阻塞直至收到協調器的提交或回滾的消息。如果協調器發生永久故障,參與者將一直等待,這里可以采用備份的協調器,所有參與者將回復發給備份協調器,由它承擔協調器的功能。
(2)如果協調器發送“請求提交”消息給參與者,它將被阻塞直到所有參與者回復了,如果某個參與者發生永久故障,那么協調器也不會一直阻塞,因為協調器在某一時間內還未收到某參與者的消息,那么它將通知其他參與者回滾事務。
同時兩階段提交協議沒有容錯機制,一個節點發生故障整個事務都要回滾,代價比較大。
四、工作過程
下面我們通過一個例子來說明兩階段提交協議的工作過程:
A組織B、C和D三個人去爬長城:如果所有人都同意去爬長城,那么活動將舉行;如果有一人不同意去爬長城,那么活動將取消。用2PC算法解決該問題的過程如下:
首先A將成為該活動的協調者,B、C和D將成為該活動的參與者。
(1)階段1:
①A發郵件給B、C和D,提出下周三去爬山,問是否同意。那么此時A需要等待B、C和D的郵件。
②B、C和D分別查看自己的日程安排表。B、C發現自己在當日沒有活動安排,則發郵件告訴A它們同意下周三去爬長城。由於某種原因, D白天沒有查看郵 件。那么此時A、B和C均需要等待。到晚上的時候,D發現了A的郵件,然后查看日程安排,發現周三當天已經有別的安排,那么D回復A說活動取消吧。
(2)階段2:
①此時A收到了所有活動參與者的郵件,並且A發現D下周三不能去爬山。那么A將發郵件通知B、C和D,下周三爬長城活動取消。
②此時B、C回復A“太可惜了”,D回復A“不好意思”。至此該事務終止。
通過該例子可以發現,2PC協議存在明顯的問題。假如D一直不能回復郵件,那么A、B和C將不得不處於一直等待的狀態。並且B和C所持有的資源,即下周三不能安排其它活動,一直不能釋放。其它等待該資源釋放的活動也將不得不處於等待狀態。
基於此,后來有人提出了三階段提交協議,在其中引入超時的機制,將階段1分解為兩個階段:在超時發生以前,系統處於不確定階段;在超市發生以后,系統則轉入確定階段。
2PC協議包含協調者和參與者,並且二者都有發生問題的可能性。假如協調者發生問題,我們可以選出另一個協調者來提交事務。例如,班長組織活動,如果班長生病了,我們可以請副班長來組織。如果協調者出問題,那么事務將不會取消。例如,班級活動希望每個人都能去,假如有一位同學不能去了,那么直接取消活動即可。或者,如果大多數人去的話那么活動如期舉行(2PC變種)。為了能夠更好地解決實際的問題,2PC協議存在很多的變種,例如:樹形2PC協議 (或稱遞歸2PC協議)、動態2階段提交協議(D2PC)等。
