1、引入超時(shí)機(jī)制。同時(shí)在協(xié)調(diào)者和參與者中都引入超時(shí)機(jī)制。
2、在第一階段和第二階段中插入一個準(zhǔn)備階段。保證了在最后提交階段之前各參與節(jié)點(diǎn)的狀態(tài)是一致的。
也就是說,除了引入超時(shí)機(jī)制之外,3PC把2PC的準(zhǔn)備階段再次一分為二,這樣三階段提交就有CanCommit、PreCommit、DoCommit三個階段。
CanCommit階段
3PC的CanCommit階段其實(shí)和2PC的準(zhǔn)備階段很像。協(xié)調(diào)者向參與者發(fā)送commit請求,參與者如果可以提交就返回Yes響應(yīng),否則返回No響應(yīng)。
1.事務(wù)詢問?協(xié)調(diào)者向參與者發(fā)送CanCommit請求。詢問是否可以執(zhí)行事務(wù)提交操作。然后開始等待參與者的響應(yīng)。
2.響應(yīng)反饋?參與者接到CanCommit請求之后,正常情況下,如果其自身認(rèn)為可以順利執(zhí)行事務(wù),則返回Yes響應(yīng),并進(jìn)入預(yù)備狀態(tài)。否則反饋No
PreCommit階段
協(xié)調(diào)者根據(jù)參與者的反應(yīng)情況來決定是否可以記性事務(wù)的PreCommit操作。根據(jù)響應(yīng)情況,有以下兩種可能。
假如協(xié)調(diào)者從所有的參與者獲得的反饋都是Yes響應(yīng),那么就會執(zhí)行事務(wù)的預(yù)執(zhí)行。
1.發(fā)送預(yù)提交請求?協(xié)調(diào)者向參與者發(fā)送PreCommit請求,并進(jìn)入Prepared階段。
2.事務(wù)預(yù)提交?參與者接收到PreCommit請求后,會執(zhí)行事務(wù)操作,并將undo和redo信息記錄到事務(wù)日志中。
3.響應(yīng)反饋?如果參與者成功的執(zhí)行了事務(wù)操作,則返回ACK響應(yīng),同時(shí)開始等待最終指令。
假如有任何一個參與者向協(xié)調(diào)者發(fā)送了No響應(yīng),或者等待超時(shí)之后,協(xié)調(diào)者都沒有接到參與者的響應(yīng),那么就執(zhí)行事務(wù)的中斷。
1.發(fā)送中斷請求?協(xié)調(diào)者向所有參與者發(fā)送abort請求。
2.中斷事務(wù)?參與者收到來自協(xié)調(diào)者的abort請求之后(或超時(shí)之后,仍未收到協(xié)調(diào)者的請求),執(zhí)行事務(wù)的中斷。
doCommit階段
該階段進(jìn)行真正的事務(wù)提交,也可以分為以下兩種情況。
執(zhí)行提交
1.發(fā)送提交請求?協(xié)調(diào)接收到參與者發(fā)送的ACK響應(yīng),那么他將從預(yù)提交狀態(tài)進(jìn)入到提交狀態(tài)。并向所有參與者發(fā)送doCommit請求。
2.事務(wù)提交?參與者接收到doCommit請求之后,執(zhí)行正式的事務(wù)提交。并在完成事務(wù)提交之后釋放所有事務(wù)資源。
3.響應(yīng)反饋?事務(wù)提交完之后,向協(xié)調(diào)者發(fā)送Ack響應(yīng)。
4.完成事務(wù)?協(xié)調(diào)者接收到所有參與者的ack響應(yīng)之后,完成事務(wù)。
中斷事務(wù)?協(xié)調(diào)者沒有接收到參與者發(fā)送的ACK響應(yīng)(可能是接受者發(fā)送的不是ACK響應(yīng),也可能響應(yīng)超時(shí)),那么就會執(zhí)行中斷事務(wù)。
1.發(fā)送中斷請求?協(xié)調(diào)者向所有參與者發(fā)送abort請求
2.事務(wù)回滾?參與者接收到abort請求之后,利用其在階段二記錄的undo信息來執(zhí)行事務(wù)的回滾操作,并在完成回滾之后釋放所有的事務(wù)資源。
3.反饋結(jié)果?參與者完成事務(wù)回滾之后,向協(xié)調(diào)者發(fā)送ACK消息
4.中斷事務(wù)?協(xié)調(diào)者接收到參與者反饋的ACK消息之后,執(zhí)行事務(wù)的中斷。
在doCommit階段,如果參與者無法及時(shí)接收到來自協(xié)調(diào)者的doCommit或者rebort請求時(shí),會在等待超時(shí)之后,會繼續(xù)進(jìn)行事務(wù)的提交。(其實(shí)這個應(yīng)該是基于概率來決定的,當(dāng)進(jìn)入第三階段時(shí),說明參與者在第二階段已經(jīng)收到了PreCommit請求,那么協(xié)調(diào)者產(chǎn)生PreCommit請求的前提條件是他在第二階段開始之前,收到所有參與者的CanCommit響應(yīng)都是Yes。(一旦參與者收到了PreCommit,意味他知道大家其實(shí)都同意修改了)所以,一句話概括就是,當(dāng)進(jìn)入第三階段時(shí),由于網(wǎng)絡(luò)超時(shí)等原因,雖然參與者沒有收到commit或者abort響應(yīng),但是他有理由相信:成功提交的幾率很大。 )
2PC與3PC的區(qū)別
相對于2PC,3PC主要解決的單點(diǎn)故障問題,并減少阻塞,因?yàn)橐坏﹨⑴c者無法及時(shí)收到來自協(xié)調(diào)者的信息之后,他會默認(rèn)執(zhí)行commit。而不會一直持有事務(wù)資源并處于阻塞狀態(tài)。但是這種機(jī)制也會導(dǎo)致數(shù)據(jù)一致性問題,因?yàn)?,由于網(wǎng)絡(luò)原因,協(xié)調(diào)者發(fā)送的abort響應(yīng)沒有及時(shí)被參與者接收到,那么參與者在等待超時(shí)之后執(zhí)行了commit操作。這樣就和其他接到abort命令并執(zhí)行回滾的參與者之間存在數(shù)據(jù)不一致的情況。
評論
查看更多