-
二階段提交
鎖定
在計算機網絡以及數據庫領域內,二階段提交(英語:Two-phase Commit)是指,為了使基於分佈式系統架構下的所有節點在進行事務提交時保持一致性而設計的一種算法(Algorithm)。通常,二階段提交也被稱為是一種協議(Protocol)。在分佈式系統中,每個節點雖然可以知曉自己的操作是成功或者失敗,卻無法知道其他節點的操作的成功或失敗。當一個事務跨越多個節點時,為了保持事務的ACID特性,需要引入一個作為協調者的組件來統一掌控所有節點(稱作參與者)的操作結果並最終指示這些節點是否要把操作結果進行真正的提交(比如將更新後的數據寫入磁盤等等)。因此,二階段提交的算法思路可以概括為: 參與者將操作成敗通知協調者,再由協調者根據所有參與者的反饋情報決定各參與者是否要提交操作還是中止操作。
需要注意的是,二階段提交(英文縮寫:2PC)不應該與併發控制中的二階段鎖(英文縮寫:2PL)進行混淆。
- 中文名
- 二階段提交
- 外文名
- Two-phase Commit
- 縮 寫
- 2PC
- 應 用
- 分佈式系統
目錄
- 1 前提
- 2 基本算法
- ▪ 第一階段提交請求階段
- ▪ 第二階段提交執行階段
- ▪ 算法示意
- 3 缺點
二階段提交前提
二階段提交算法的成立基於以下假設:
- 該分佈式系統中,存在一個節點作為協調者(Coordinator),其他節點作為參與者(Cohorts)。且節點之間可以進行網絡通信。
- 所有節點都採用預寫式日誌,且日誌被寫入後即被保持在可靠的存儲設備上,即使節點損壞不會導致日誌數據的消失。
二階段提交基本算法
以下對二階段提交算法分階段進行説明。
二階段提交第一階段提交請求階段
- 協調者節點向所有參與者節點詢問是否可以執行提交操作,並開始等待各參與者節點的響應。
- 參與者節點執行詢問發起為止的所有事務操作,並將Undo信息和Redo信息寫入日誌。
- 各參與者節點響應協調者節點發起的詢問。如果參與者節點的事務操作實際執行成功,則它返回一個"同意"消息;如果參與者節點的事務操作實際執行失敗,則它返回一個"中止"消息。
有時候,第一階段也被稱作投票階段,即各參與者投票是否要繼續接下來的提交操作。
二階段提交第二階段提交執行階段
成功
當協調者節點從所有參與者節點獲得的相應消息都為"同意"時:
- 協調者節點向所有參與者節點發出"正式提交"的請求。
- 參與者節點正式完成操作,並釋放在整個事務期間內佔用的資源。
- 參與者節點向協調者節點發送"完成"消息。
- 協調者節點收到所有參與者節點反饋的"完成"消息後,完成事務。
失敗
如果任一參與者節點在第一階段返回的響應消息為"終止",或者 協調者節點在第一階段的詢問超時之前無法獲取所有參與者節點的響應消息時:
- 協調者節點向所有參與者節點發出"回滾操作"的請求。
- 參與者節點利用之前寫入的Undo信息執行回滾,並釋放在整個事務期間內佔用的資源。
- 參與者節點向協調者節點發送"回滾完成"消息。
- 協調者節點收到所有參與者節點反饋的"回滾完成"消息後,取消事務。
有時候,第二階段也被稱作完成階段,因為無論結果怎樣,協調者都必須在此階段結束當前事務。
二階段提交算法示意
"*" 所標記的操作意味着此類操作必須記錄在穩固存儲上。
二階段提交缺點
二階段提交算法的最大缺點就在於 它的執行過程中間,節點都處於阻塞狀態。即節點之間在等待對方的相應消息時,它將什麼也做不了。特別是,當一個節點在已經佔有了某項資源的情況下,為了等待其他節點的響應消息而陷入阻塞狀態時,當第三個節點嘗試訪問該節點佔有的資源時,這個節點也將連帶陷入阻塞狀態。