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