三段提交(3PC)是對兩段提交(2PC)的一種升級優化,3PC在2PC的階段和第二階段中插入一個準備階段。保證了在最后提交階段之前,各參與者節點的狀態都一致。同時在協調者和參與者中都引入超時機制,當參與者各種原因未收到協調者的commit請求后,會對本地事務進行commit,不會一直阻塞等待,解決了2PC的單點故障問題,但3PC還是沒能從根本上解決數據一致性的問題。
3PC的三個階段分別是CanCommit、PreCommit、DoCommit:
CanCommit:協調者向所有參與者發送CanCommit命令,詢問是否可以執行事務提交操作。如果全部響應YES則進入下一個階段。
PreCommit:協調者向所有參與者發送PreCommit命令,詢問是否可以進行事務的預提交操作,參與者接收到PreCommit請求后,如參與者成功的執行了事務操作,則返回Yes響應,進入最終commit階段。一旦參與者中有向協調者發送了No響應,或因網絡造成超時,協調者沒有接到參與者的響應,協調者向所有參與者發送abort請求,參與者接受abort命令執行事務的中斷。
DoCommit:在前兩個階段中所有參與者的響應反饋均是YES后,協調者向參與者發送DoCommit命令正式提交事務,如協調者沒有接收到參與者發送的ACK響應,會向所有參與者發送abort請求命令,執行事務的中斷。