2PC,是Two-Phase Commit 的縮寫塘揣,也就是二階段提交,是在數(shù)據(jù)庫(kù)領(lǐng)域處理事務(wù)亲铡,保證原子性的一種常用算法才写。通常會(huì)把二階段提交協(xié)議認(rèn)為是一種一致性協(xié)議奖蔓,在處理成功的時(shí)候統(tǒng)一執(zhí)行事務(wù),在處理失敗的時(shí)候統(tǒng)一進(jìn)行回滾吆鹤,從而來(lái)有效的保證分布式數(shù)據(jù)的一致性厨疙。
協(xié)議說(shuō)明
顧名思義疑务,二階段提交協(xié)議就是把事務(wù)的提交過(guò)程分為倆個(gè)階段來(lái)進(jìn)行處理,執(zhí)行的過(guò)程如下:
-
一知允、提交事務(wù)請(qǐng)求:
協(xié)調(diào)者對(duì)所有的參與者發(fā)送事務(wù)內(nèi)容并詢問(wèn)是否可以提交操作,并開(kāi)始等待參與者的相應(yīng)温鸽。參與者節(jié)點(diǎn)來(lái)執(zhí)行事務(wù)操作保屯,并把Undo和Redo的信息記錄在日志中嗤朴,當(dāng)參與者成功的執(zhí)行了事務(wù)就反饋給協(xié)調(diào)者Yes,表示事務(wù)可以執(zhí)行雹姊;如果參與者沒(méi)有成功的執(zhí)行事務(wù)股缸,那么就會(huì)反饋給協(xié)調(diào)者No相應(yīng)吱雏,表示事務(wù)不可以執(zhí)行敦姻。 -
二、執(zhí)行事務(wù)提交:
當(dāng)協(xié)調(diào)者從所有的參與者獲得的反饋都是Yes的時(shí)候镰惦,就會(huì)執(zhí)行事務(wù)的提交。協(xié)調(diào)者對(duì)所有的參與者發(fā)起一個(gè)Commit請(qǐng)求旺入,當(dāng)參與者收到了Commit請(qǐng)求之后就會(huì)正式的進(jìn)行事務(wù)的提交兑凿,在完成了提交之后會(huì)反饋協(xié)調(diào)者一個(gè)Ack消息茵瘾,當(dāng)協(xié)調(diào)者收到了所有的Ack消息后完成事務(wù)。
當(dāng)協(xié)調(diào)者從所有的參與者獲得的反饋包含了No,或者在等待超時(shí)之后沒(méi)有獲得所有的響應(yīng)拗秘,就會(huì)中斷事務(wù)圣絮,向所有的參與者發(fā)出rollback請(qǐng)求雕旨,參與者在收到了請(qǐng)求之后,回去查詢?cè)陔A段一里記錄的Undo信息來(lái)執(zhí)行事務(wù)的回滾操作凡涩,并在完成回滾之后釋放整個(gè)事務(wù)執(zhí)行期間占用的資源棒搜,同樣完成了回滾之后會(huì)反饋協(xié)調(diào)者一個(gè)Ack消息突照,當(dāng)協(xié)調(diào)者收到了所有的Ack消息后完成事務(wù)中斷氧吐。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):原理簡(jiǎn)單讹蘑,實(shí)現(xiàn)方便
缺點(diǎn):同步阻塞,單點(diǎn)問(wèn)題座慰,數(shù)據(jù)不一致,太過(guò)保守翠拣。
缺點(diǎn)的前倆個(gè)都很容易理解,至于數(shù)據(jù)不一致的情況是在二階段的commit的時(shí)候误墓,可能有節(jié)點(diǎn)沒(méi)有收到commit指令蛮粮,于是出現(xiàn)了有的事務(wù)進(jìn)行了提交谜慌,有的沒(méi)有辦法提交事務(wù)。太過(guò)保守則是任意一個(gè)節(jié)點(diǎn)的失敗都會(huì)導(dǎo)致整個(gè)事務(wù)的失敗欣范。