3PC , 是Three-Phase Commit的縮寫(xiě),即三階段提交,是2PC的改進(jìn)版,將二階段提交協(xié)議的“提交事務(wù)請(qǐng)求” 一份為二變成了CanCommit,PreCommit,do Commit三個(gè)階段組成的事務(wù)處理協(xié)議。
- 階段一:CanCommit
1、事務(wù)詢問(wèn):協(xié)調(diào)者向所有的參與者發(fā)送包含了事務(wù)內(nèi)容的canCommit請(qǐng)求,詢問(wèn)是否可以進(jìn)行事務(wù)提交操作,并開(kāi)始等待各參與者的響應(yīng)。
2、各參與者向協(xié)調(diào)者反饋事務(wù)詢問(wèn)的響應(yīng):如果參與者認(rèn)為自己可以順利執(zhí)行事務(wù)則返回Yes,否則返回No響應(yīng)。
- 階段二:PreCommit
情況1 執(zhí)行事務(wù)預(yù)提交:當(dāng)在第一個(gè)階段里所有參與者的反饋都是Yes,則會(huì)進(jìn)行事務(wù)預(yù)提交。
1、發(fā)送預(yù)提交請(qǐng)求:協(xié)調(diào)者向所有參與者節(jié)點(diǎn)發(fā)送preCommit請(qǐng)求,然后進(jìn)入Prepared階段。
2、事務(wù)預(yù)提交:參與者接受到了preCommit請(qǐng)求后,會(huì)執(zhí)行事務(wù)操作,并將Undo和Redo信息記錄在事務(wù)日志當(dāng)中。
3、反饋事務(wù)執(zhí)行的響應(yīng):參與者成功執(zhí)行了事務(wù)操作,就會(huì)反饋給協(xié)調(diào)者Ack響應(yīng),同時(shí)等待最終的指令:提交或者中止。
情況2 中斷事務(wù):在第一階段收到了No的反饋,或者在超時(shí)之后無(wú)法收到所有的反饋,則進(jìn)行中斷事務(wù)操作。向所有的參與者發(fā)出abort請(qǐng)求。
- 階段三:doCommit
情況1 執(zhí)行提交:
1、發(fā)送提交請(qǐng)求:在假設(shè)協(xié)調(diào)者處于正常工作狀態(tài),并且收到了來(lái)自所有參與者的Ack響應(yīng),那么就會(huì)向所有的參與者發(fā)出doCommit請(qǐng)求。
2、事務(wù)提交:參與者接收到了doCommit請(qǐng)求之后,會(huì)正式的執(zhí)行事務(wù)提交操作,并在完成提交之后釋放在整個(gè)事務(wù)執(zhí)行期間所占用的事務(wù)資源。
3、反饋事務(wù)提交結(jié)果:參與者在完成了事務(wù)之后,會(huì)想?yún)f(xié)調(diào)者發(fā)送Ack響應(yīng)信息。
4、完成事務(wù):協(xié)調(diào)者接收到所有參與者反饋的Ack消息之后完成事務(wù)。
情況2 中斷事務(wù):在第二階段收到了No的反饋,或者在超時(shí)之后無(wú)法收到所有的反饋,則進(jìn)行中斷事務(wù)操作。向所有的參與者發(fā)出abort請(qǐng)求。參與者會(huì)利用在階段二中記錄的Undo信息進(jìn)行回滾,并且在完成回滾之后釋放在整個(gè)事務(wù)執(zhí)行期間占用的資源。
三階段協(xié)議的優(yōu)缺點(diǎn)
-
優(yōu)點(diǎn):降低了參與者的阻塞范圍,并且能夠在出現(xiàn)單點(diǎn)故障后繼續(xù)達(dá)成一致。
-
缺點(diǎn):在參與者收到了PreCommit的請(qǐng)求后由于網(wǎng)絡(luò)分區(qū),此時(shí)協(xié)調(diào)者所在的節(jié)點(diǎn)和參與者無(wú)法進(jìn)行正常的網(wǎng)絡(luò)通信,在這種情況下,參與者依舊會(huì)進(jìn)行事務(wù)的提交,會(huì)出現(xiàn)數(shù)據(jù)不一致的問(wèn)題。
小疑問(wèn):協(xié)調(diào)者所在的節(jié)點(diǎn)和參與者無(wú)法進(jìn)行正常的網(wǎng)絡(luò)通信不算超時(shí)后沒(méi)有獲取到所有節(jié)點(diǎn)的反饋嗎?此時(shí)不應(yīng)該去中斷事務(wù)嘛。