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