分布式事務(wù)
2PC
一階段:
事務(wù)的協(xié)調(diào)者向所有的事務(wù)參與者發(fā)起prepare請(qǐng)求附帽,參與者接收到請(qǐng)求之后,執(zhí)行本地事務(wù)更新井誉,但是暫時(shí)不提交蕉扮。返回完成消息給事務(wù)協(xié)調(diào)者,
事務(wù)協(xié)調(diào)者受到消息之后開(kāi)啟二階段颗圣。
二階段:
事務(wù)協(xié)調(diào)者收到所有的參與者的完成消息之后喳钟,通過(guò)所有的參與者Commit本地事務(wù)屁使,事務(wù)參與者各種提交本地事務(wù),釋放資源奔则,向事務(wù)協(xié)調(diào)者反饋完成
消息蛮寂。都全部完成之后,整個(gè)分布式事務(wù)完成易茬。酬蹋。
存在問(wèn)題:
1.性能問(wèn)題
XA協(xié)議追求強(qiáng)一致性,只有所有的節(jié)點(diǎn)準(zhǔn)備完成才會(huì)通知提交抽莱,性能很差范抓。
2.協(xié)調(diào)者單點(diǎn)故障
事務(wù)協(xié)調(diào)者節(jié)點(diǎn)如果掛掉之后,整個(gè)事務(wù)就會(huì)出錯(cuò)
3.數(shù)據(jù)不一致問(wèn)題
在二階段中岸蜗,如果因?yàn)榫W(wǎng)絡(luò)問(wèn)題尉咕,一些事務(wù)的參與者沒(méi)有收到commit消息,一些事務(wù)收到提交璃岳,會(huì)導(dǎo)致節(jié)點(diǎn)之間的數(shù)據(jù)不一致問(wèn)題
3PC
三階段CanCommit
事務(wù)參與者一直沒(méi)有收到commit提交消息年缎,引入CanCommit超時(shí)機(jī)制,本地會(huì)自動(dòng)提交铃慷。解決了2PC的協(xié)調(diào)者單點(diǎn)故障問(wèn)題单芜,但是還是沒(méi)有解決性能和不一致問(wèn)題。
TCC
try
事務(wù)提交前的檢查犁柜,預(yù)留好資源
commit
確定執(zhí)行業(yè)務(wù)操作洲鸠,對(duì)try階段預(yù)留的資源正式執(zhí)行。
cancel
取消執(zhí)行業(yè)務(wù)操作馋缅,對(duì)try階段預(yù)留的資源釋放扒腕。
RocketMQ事務(wù)
1.消息發(fā)送方先發(fā)送一個(gè)半消息。此時(shí)消費(fèi)端不能消費(fèi)
2.發(fā)送成功之后萤悴,執(zhí)行本地事務(wù)
3.本地事務(wù)執(zhí)行成功之后瘾腰,消息發(fā)送方會(huì)提交半消息,此時(shí)消費(fèi)端可以消息覆履。
問(wèn)題:如果發(fā)送預(yù)備消息成功蹋盆,執(zhí)行本地事務(wù)成功,但發(fā)送確認(rèn)消息失斚跞栖雾;這個(gè)就有問(wèn)題了,因?yàn)橛脩鬉扣款成功了伟众,
但加錢(qián)業(yè)務(wù)沒(méi)有訂閱到確認(rèn)消息析藕,無(wú)法加錢(qián)。這里出現(xiàn)了數(shù)據(jù)不一致赂鲤。
MQ提供狀態(tài)會(huì)查機(jī)制噪径,會(huì)定時(shí)遍歷commitlog中的半消息柱恤,可以在會(huì)查的時(shí)候查詢本地事務(wù)是否提交成功,如果成功則提交半消息找爱,消費(fèi)端可以消費(fèi)梗顺。
Seata
AT模式
執(zhí)行流程
1.TM向TC申請(qǐng)開(kāi)啟一個(gè)全局事務(wù),TC返回一個(gè)唯一的全局事務(wù)XID
2.RM向TC注冊(cè)分支事務(wù)车摄,并把它納入到全局事務(wù)XID管理寺谤,返回分支事務(wù)branceId
3.RM執(zhí)行本地事務(wù),操作數(shù)據(jù)庫(kù)吮播,記錄數(shù)據(jù)操作前后的鏡像变屁,連同XID branceId 記錄到undo_log表中
4.RM執(zhí)行成功后遠(yuǎn)程調(diào)用兩一個(gè)分支事務(wù),傳播XID到另一個(gè)分支事務(wù)
5.另一個(gè)分支事務(wù)繼續(xù)向TC注冊(cè)本地事務(wù),加入到XID對(duì)應(yīng)的全局事務(wù)中意狠,返回分支事務(wù)branchId
6.執(zhí)行本地事務(wù)粟关,操作數(shù)據(jù)庫(kù),記錄數(shù)據(jù)操作前后的鏡像环戈,連同XID branchId 記錄到undo_log表中
7.全局事務(wù)鏈路處理完成之后闷板,TM向TC發(fā)起全局事務(wù)的提交或回滾
8.TC管理所有的分支事務(wù),決定是否需要回滾