過程簡述:
第一階段
- 事務(wù)詢問: 協(xié)調(diào)者向所有的參與者發(fā)送事務(wù)內(nèi)容,詢問是否可以執(zhí)行事務(wù)提交操作室囊, 并開始等待各個參與者的響應(yīng)
- 事務(wù)執(zhí)行: 各個參與者執(zhí)行事務(wù)操作, 并將undo 和redo(要redo信息干嘛, 節(jié)點(diǎn)重啟之后重做? )信息記入事務(wù)日志中
- 各參與者向協(xié)調(diào)者反饋事務(wù)詢問的響應(yīng),YES/NO
第二階段(執(zhí)行事務(wù)提交/中斷事務(wù))
執(zhí)行事務(wù)提交(假如協(xié)調(diào)者收到的都是YES)
- 發(fā)送提交請求: 協(xié)調(diào)者向所有參與者發(fā)送commit請求
- 事務(wù)提交:參與者在收到commit請求后湾宙,會正式執(zhí)行事務(wù)提交操作,并在提交完成后釋放整個事務(wù)執(zhí)行期間所占有的資源
- 反饋事務(wù)提交結(jié)果:參與者在完成事務(wù)提交之后冈绊, 想?yún)f(xié)調(diào)者發(fā)送ACK請求
- 協(xié)調(diào)者接受到所有參與者反饋的ACK后创倔,完成事務(wù)
中斷事務(wù)(假如任何一個參與者向協(xié)調(diào)者反饋NO后, 或者在等待超時之后焚碌,協(xié)調(diào)者無法接受到所有參與者的響應(yīng),那么就中斷事務(wù))
- 發(fā)送回滾請求:協(xié)調(diào)者向所有的參與者節(jié)點(diǎn)發(fā)rollback請求
- 事務(wù)回滾:參與者接收到rollback請求后霸妹, 會利用第一階段記錄的undo信息來執(zhí)行事務(wù)操作的回滾十电,并在回滾之后釋放整個事務(wù)執(zhí)行期間所占用的資源
- 反饋事務(wù)回滾結(jié)果:參與者在事務(wù)回滾之后,向協(xié)調(diào)者發(fā)送ACK信息
- 中斷事務(wù):協(xié)調(diào)者接收到所有參與者反饋的ACK之后, 完成事務(wù)中斷
優(yōu)缺點(diǎn):
優(yōu)點(diǎn):原理簡單鹃骂, 實(shí)現(xiàn)方便
缺點(diǎn):同步阻塞台盯,單點(diǎn)問題, 腦裂畏线, 太過保守
同步阻塞:在兩個階段執(zhí)行的過程中静盅,所以參與該事務(wù)操作的邏輯都出于阻塞狀態(tài), 從而無法進(jìn)行任何操作
單點(diǎn)問題:協(xié)調(diào)者是單點(diǎn)寝殴,如果協(xié)調(diào)者在階段二出現(xiàn)問題蒿叠,那么其他的參與者將會一直出于鎖定事務(wù)資源狀態(tài)中..
數(shù)據(jù)不一致: 在階段二,如果發(fā)生局部網(wǎng)絡(luò)異瞅汲#或者協(xié)調(diào)者尚未發(fā)送完所有的commit請求之前奔潰市咽, 導(dǎo)致只有部分參與者收到了commit的提交, 那么就會發(fā)生數(shù)據(jù)不一致
太過保守: 如果協(xié)調(diào)者在詢問是否可以提交的時候抵蚊, 參與者出現(xiàn)故障而協(xié)調(diào)者始終無法獲取到所有參與者的響應(yīng)信息的話施绎,這時候協(xié)調(diào)者只能依靠自身的超時機(jī)制來判斷是否需要中斷事務(wù),這樣的策略太過保守贞绳。 也就是沒有一套完善的容錯機(jī)制谷醉, 任何一個節(jié)點(diǎn)的失敗都會導(dǎo)致整個事務(wù)的失敗