三階段提交 (3PC)是在兩階段提交 (2PC)的基礎上進行優化。網絡
主要涉及兩個方面post
整個事務分爲 CanCommit、PreCommit、DoCommit 三個階段。優化
事務詢問:協調者向參與者發送CanCommit請求。詢問是否能夠執行事務提交操做。而後開始等待參與者的響應;日誌
響應反饋:參與者接到CanCommit請求以後,正常狀況下,若是其自身認爲能夠順利執行事務,則返回Yes響應,並進入預備狀態。不然反饋No;cdn
協調者根據參與者的反應狀況來決定是否能夠進行事務的PreCommit操做。根據響應狀況,有如下兩種可能:blog
狀況1:事務
假如協調者從全部的參與者得到的反饋都是Yes響應,那麼就會執行事務的預執行資源
狀況2:get
假若有任何一個參與者向協調者發送了No響應,或者等待超時以後,協調者都沒有接到參與者的響應,那麼就執行事務的中斷。it
該階段進行真正的事務提交,分爲如下兩種狀況:
狀況1:
接收到全部參與者發送的ACK響應,執行提交
狀況2:
協調者沒有接收到參與者發送的ACK響應,中斷事務
相對於2PC,3PC主要解決的單點故障問題,並減小阻塞,由於一旦參與者沒法及時收到來自協調者的信息以後,他會默認執行commit。而不會一直持有事務資源並處於阻塞狀態。可是這種機制也會致使數據一致性問題,由於,因爲網絡緣由,協調者發送的abort響應沒有及時被參與者接收到,那麼參與者在等待超時以後執行了commit操做。這樣就和其餘接到abort命令並執行回滾的參與者之間存在數據不一致的狀況。