您好,登錄后才能下訂單哦!
前言:
分布式事務(wù)專題一直是面試的重點(diǎn),這篇文章主要是討論一下分布式事務(wù)中的2pc協(xié)議。如果你之前看過CAP和BASE理論,會(huì)對(duì)這篇文章的理解有更大的幫助。文末有福利分享哦朋友們
一、什么是2pc協(xié)議
2PC即兩階段提交協(xié)議,是將整個(gè)事務(wù)流程分為兩個(gè)階段,準(zhǔn)備階段(Prepare phase)、提交階段(commitphase),2是指兩個(gè)階段,P是指準(zhǔn)備階段,C是指提交階段。
如何理解呢?比如說同學(xué)聚會(huì),AA制。
(1)準(zhǔn)備階段:每個(gè)人出錢
(2)提交階段:錢齊了付款
在這倆階段中,任何一個(gè)環(huán)節(jié)出現(xiàn)了錯(cuò)誤,整個(gè)事務(wù)都會(huì)流產(chǎn)。在常見的關(guān)系型數(shù)據(jù)庫中就支持了2pc協(xié)議。比如有名的mysql數(shù)據(jù)庫。
(1)準(zhǔn)備階段(Prepare phase):事務(wù)管理器給每個(gè)參與者發(fā)送Prepare消息,每個(gè)數(shù)據(jù)庫參與者在本地執(zhí)行事務(wù),并寫本地的Undo/Redo日志,此時(shí)事務(wù)沒有提交。
(2)提交階段(commit phase):如果事務(wù)管理器收到了參與者的執(zhí)行失敗或者超時(shí)消息時(shí),直接給每個(gè)參與者發(fā)送回滾(Rollback)消息;
下面是成功的情況:階段1是準(zhǔn)備階段,階段2是提交階段
下面是失敗的情況。
這就是失敗的情況。
二、使用seata實(shí)現(xiàn)2pc事務(wù)
這個(gè)seata是阿里提供的分布式事務(wù)框架。Seata把一個(gè)分布式事務(wù)理解成一個(gè)包含了若干分支事務(wù)的全局事務(wù)。全局事務(wù)的職責(zé)是協(xié)調(diào)其下管轄的分支事務(wù)達(dá)成一致,要么一起成功提交,要么一起失敗回滾。此外,通常分支事務(wù)本身就是一個(gè)關(guān)系數(shù)據(jù)庫的本地事務(wù),下圖是全局事務(wù)與分支事務(wù)的關(guān)系圖:
Seata定義了3個(gè)組件來協(xié)議分布式事務(wù)的處理過程 。
(1)Transaction Manager (TM):事務(wù)管理器,TM需要嵌入應(yīng)用程序中工作,它負(fù)責(zé)開啟一個(gè)全局事務(wù),并最終向TC發(fā)起全局提交或全局回滾的指令。
(2)Transaction Coordinator (TC):事務(wù)協(xié)調(diào)器,它是獨(dú)立的中間件,需要獨(dú)立部署運(yùn)行,它維護(hù)全局事務(wù)的運(yùn)行狀態(tài),接收TM指令發(fā)起全局事務(wù)的提交與回滾,負(fù)責(zé)與RM通信協(xié)調(diào)各各分支事務(wù)的提交或回滾。
(3)Resource Manager (RM):控制分支事務(wù),負(fù)責(zé)分支注冊(cè)、狀態(tài)匯報(bào),并接收事務(wù)協(xié)調(diào)器TC的指令,驅(qū)動(dòng)分支(本地)事務(wù)的提交和回滾。
這些概念看起來有點(diǎn)懵逼,舉個(gè)例子吧:拿新用戶注冊(cè)送積分舉例Seata的分布式事務(wù)過程
具體的執(zhí)行流程如下:
(1)用戶服務(wù)的 TM 向 TC 申請(qǐng)開啟一個(gè)全局事務(wù),全局事務(wù)創(chuàng)建成功并生成一個(gè)全局唯一的XID。
(2)用戶服務(wù)的 RM 向 TC 注冊(cè) 分支事務(wù),該分支事務(wù)在用戶服務(wù)執(zhí)行新增用戶邏輯,并將其納入 XID 對(duì)應(yīng)全局事務(wù)的管轄。
(3)用戶服務(wù)執(zhí)行分支事務(wù),向用戶表插入一條記錄。
(4)邏輯執(zhí)行到遠(yuǎn)程調(diào)用積分服務(wù)時(shí)(XID 在微服務(wù)調(diào)用鏈路的上下文中傳播)。積分服務(wù)的RM 向 TC 注冊(cè)分支事務(wù),該分支事務(wù)執(zhí)行增加積分的邏輯,并將其納入 XID 對(duì)應(yīng)全局事務(wù)的管轄。
(5)積分服務(wù)執(zhí)行分支事務(wù),向積分記錄表插入一條記錄,執(zhí)行完畢后,返回用戶服務(wù)。
(6)用戶服務(wù)分支事務(wù)執(zhí)行完畢。
(7)TM 向 TC 發(fā)起針對(duì) XID 的全局提交或回滾決議。
(8)TC 調(diào)度 XID 下管轄的全部分支事務(wù)完成提交或回滾請(qǐng)求。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。