事務(wù)類型
2PC
2PC全稱Two-phaseCommit烈拒,中文名是二階段提交,是XA規(guī)范的實(shí)現(xiàn)思路挽荠,XA規(guī)范是 X/Open DTP 定義的交易中間件與數(shù)據(jù)庫之間的接口規(guī)范(即接口函數(shù))穗熬,交易中間件用它來通知數(shù)據(jù)庫事務(wù)的開始中狂、結(jié)束以及提交、回滾等啦膜。XA 接口函數(shù)由數(shù)據(jù)庫廠商提供有送。
X/Open DTP是X/Open 組織(即現(xiàn)在的 Open Group )1994定義的分布式事務(wù)處理模型。XA規(guī)模型包括應(yīng)用程序( AP )僧家、事務(wù)管理器( TM )雀摘、資源管理器( RM )、通信資源管理器( CRM )四部分八拱。一般阵赠,常見的事務(wù)管理器( TM )是交易中間件涯塔,常見的資源管理器( RM )是數(shù)據(jù)庫,常見的通信資源管理器( CRM )是消息中間件清蚀。
2PC 通常使用到XA中的三個(gè)角色TM匕荸、AP
AP:事務(wù)發(fā)起方,通常為微服務(wù)自身枷邪;定義事務(wù)邊界(事務(wù)開始榛搔、結(jié)束),并訪問事務(wù)邊界內(nèi)的資源
TM:事務(wù)協(xié)調(diào)方东揣,事務(wù)操作總控践惑;管理事務(wù)全局事務(wù),分配事務(wù)唯一標(biāo)識嘶卧,監(jiān)控事務(wù)的執(zhí)行進(jìn)度尔觉,負(fù)責(zé)事務(wù)的提交、回滾芥吟、失敗恢復(fù)侦铜。
RM:本地事務(wù)資源,根據(jù)協(xié)調(diào)方命令進(jìn)行操作运沦;管理本地共享資源(既數(shù)據(jù)庫)泵额。
2PC流程
2PC 分成2個(gè)階段,第一階段:請求階段(commit-request phase携添,或稱表決階段嫁盲,voting phase)和第二階段:提交階段(commit phase)。
表決階段:事務(wù)協(xié)調(diào)者(TM)串行給每個(gè)參與者(RM)發(fā)送Prepare消息烈掠,每個(gè)參與者要么直接返回失敗羞秤,要么在本地SQL執(zhí)行、記錄事務(wù)日志(Undo左敌、Redo)瘾蛋,但不提交,到達(dá)一種“萬事俱備矫限,只欠東風(fēng)”的狀態(tài)哺哼。
可以進(jìn)一步將準(zhǔn)備階段分為以下三個(gè)步驟:
1)TM串行向每個(gè)參與者節(jié)點(diǎn)詢問是否可以執(zhí)行提交操作,并等待各參與者節(jié)點(diǎn)的響應(yīng)叼风。
2)參與者節(jié)點(diǎn)執(zhí)行詢問的所有SQL語句取董,并將Undo和Redo寫入日志。
3)各參與者節(jié)點(diǎn)響應(yīng)TM發(fā)起的詢問无宿。如果參與者節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行成功茵汰,則返回一個(gè)”success”消息;如果參與者節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行失敗孽鸡,則返回一個(gè)”abort”消息蹂午。
提交階段:如果TM收到了參與者的失敗消息或者超時(shí)栏豺,直接給每個(gè)參與者發(fā)送回滾(Rollback)消息;否則豆胸,發(fā)送提交(Commit)消息奥洼;參與者根據(jù)TM的指令執(zhí)行提交或者回滾操作,釋放所有事務(wù)處理過程中使用的鎖資源配乱。(注意:必須在最后階段釋放鎖資源)
分支一:當(dāng)TM從所有參與者節(jié)點(diǎn)獲得的相應(yīng)消息都為”success”時(shí):
1)TM向所有參與者節(jié)點(diǎn)發(fā)出”正式提交(commit)”的請求溉卓。
2)參與者節(jié)點(diǎn)正式完成操作,并釋放在整個(gè)事務(wù)期間內(nèi)占用的資源搬泥。
3)參與者節(jié)點(diǎn)向TM發(fā)送”完成”消息桑寨。
4)TM受到所有參與者節(jié)點(diǎn)反饋的”完成”消息后,完成事務(wù)忿檩。
分支二:如果任一參與者節(jié)點(diǎn)在第一階段返回的響應(yīng)消息為”abort”尉尾,或者 TM在第一階段的詢問超時(shí)之前無法獲取所有參與者節(jié)點(diǎn)的響應(yīng)消息時(shí):
1)TM向所有參與者節(jié)點(diǎn)發(fā)出”回滾操作(rollback)”的請求。
2)參與者節(jié)點(diǎn)利用之前寫入的Undo信息執(zhí)行回滾燥透,并釋放在整個(gè)事務(wù)期間內(nèi)占用的資源沙咏。
3)參與者節(jié)點(diǎn)向TM發(fā)送”回滾完成”消息。
4)TM受到所有參與者節(jié)點(diǎn)反饋的”回滾完成”消息后班套,取消事務(wù)肢藐。
第二階段如果commit或者rollback失敗了,TM負(fù)責(zé)重試直到全部執(zhí)行吱韭。
2PC存在的問題
1吆豹、全流程的同步阻塞:不管是第一階段還是第二階段,所有參與節(jié)點(diǎn)都是事務(wù)阻塞型理盆。當(dāng)參與者占有公共資源時(shí)痘煤,其他第三方訪問公共資源可能不得不處于阻塞狀態(tài)。
2猿规、TM單點(diǎn)故障:由于全流程依賴TM的協(xié)調(diào)衷快,一旦TM發(fā)生故障。參與者會一直阻塞下去姨俩。尤其在第二階段蘸拔,TM發(fā)生故障,那么所有的參與者還都處于鎖定事務(wù)資源的狀態(tài)中环葵,而無法繼續(xù)完成事務(wù)操作都伪。所有參與者必須等待TM重新上線(TM重新選舉)后才能繼續(xù)工作。
3积担、TM腦裂引起數(shù)據(jù)不一致:在第二階段中,當(dāng)TM向參與者發(fā)送commit請求之后猬仁,發(fā)生了局部網(wǎng)絡(luò)異车坭担或者在發(fā)送commit請求過程中TM發(fā)生了故障先誉,這會導(dǎo)致只有一部分參與者接受到了commit請求。而在這部分參與者接到commit請求之后就會執(zhí)行commit操作的烁。但是其他部分未接到commit請求的機(jī)器則無法執(zhí)行事務(wù)提交褐耳。于是整個(gè)分布式系統(tǒng)便出現(xiàn)了數(shù)據(jù)不一致性的現(xiàn)象。
4渴庆、TM腦裂引起事務(wù)狀態(tài)不確定:TM再發(fā)出commit消息之后宕機(jī)铃芦,而接收到這條消息的參與者同時(shí)也宕機(jī)了。那么即使通過選舉協(xié)議產(chǎn)生了新的TM襟雷,這條事務(wù)的狀態(tài)也是不確定的刃滓,沒人知道事務(wù)是否被已經(jīng)提交。
3PC
2PC是CP的剛性事務(wù)耸弄,追求數(shù)據(jù)強(qiáng)一致性咧虎。但是通過我們上面分析可以得知TM腦裂可能造成數(shù)據(jù)不一致和事務(wù)狀態(tài)不確定問題。無法達(dá)到CP的完美狀態(tài)计呈。因此業(yè)界就出現(xiàn)了3PC砰诵,用來處理TM腦裂引起的數(shù)據(jù)不一致和事務(wù)狀態(tài)不確定問題。
因?yàn)?PC是為徹底解決的2PC的數(shù)據(jù)不一致和事務(wù)狀態(tài)不確定問題而出現(xiàn)捌显。根據(jù)這一個(gè)前提茁彭,加上筆者對3PC的理解,總結(jié)出3PC的注釋事項(xiàng):
1)3PC確保任何分支下的數(shù)據(jù)一致性
2)3PC確保任何分支最多3次握手得到最終結(jié)果(超時(shí)機(jī)制)
3)RM超時(shí)后的事務(wù)狀態(tài)必須從TM獲取扶歪。2PC只有TM的超時(shí)機(jī)制理肺,3PC新增了參與者(RM)的超時(shí)機(jī)制,一方面輔助解決了2PC的事務(wù)/事務(wù)問題击罪,還能降低一定的同步阻塞問題哲嘲。因?yàn)門M、RM雙向超時(shí)機(jī)制媳禁,所以維基百科對3PC定義為“非阻塞”協(xié)議眠副。
3PC流程
3PC 分成3個(gè)階段:CanCommit(準(zhǔn)備階段)、PreCommit(對齊階段)竣稽、DoCommit(提交階段)囱怕;
準(zhǔn)備階段:跟2PC的表決階段很類似,TM向參與者發(fā)送commit請求毫别,參與者如果可以提交就返回Yes娃弓,否則返回No,詢問超時(shí)默認(rèn)參與者為No岛宦。唯一差別在于SQL層面:準(zhǔn)備階段只做了SQL處理台丛,并未記錄事務(wù)日志(Undo 和Redo)
對齊階段:TM 和 各個(gè)參與者對齊事務(wù)狀態(tài),TM 通知各個(gè)參與者事務(wù)最終狀態(tài),各個(gè)參與者如果一致未收到事務(wù)對齊通知挽霉,會在超時(shí)后從TM反查事務(wù)狀態(tài)實(shí)現(xiàn)事務(wù)狀態(tài)對齊防嗡。在SQL層面:事務(wù)狀態(tài)對齊后,記錄事務(wù)日志(Undo 和Redo)
提交階段:該階段進(jìn)行真正的事務(wù)提交侠坎。根據(jù)第二階段得到的事務(wù)狀態(tài)結(jié)果蚁趁,各參與者根據(jù)TM的通知命令進(jìn)行提交/abort或者超時(shí)后自動(dòng)提交/abort。
3PC只是為了解決2PC弊端的理論產(chǎn)物实胸,并沒有實(shí)際落地他嫡。
TCC
TCC 是一種補(bǔ)償型事務(wù),該模型要求應(yīng)用的每個(gè)服務(wù)提供 try庐完、confirm钢属、cancel 三個(gè)接口,它的核心思想是通過對資源的預(yù)留(提供中間態(tài)假褪,如賬戶狀態(tài)署咽、凍結(jié)金額等),盡早釋放對資源的加鎖生音,如果事務(wù)可以提交宁否,則完成對預(yù)留資源的確認(rèn),如果事務(wù)要回滾缀遍,則釋放預(yù)留的資源慕匠。
TCC模型完全交由業(yè)務(wù)實(shí)現(xiàn),每個(gè)子業(yè)務(wù)都需要實(shí)現(xiàn)Try-Confirm-Cancel三個(gè)接口域醇,對業(yè)務(wù)侵入大台谊,資源鎖定交由業(yè)務(wù)方。
1譬挚、Try:嘗試執(zhí)行業(yè)務(wù)锅铅,完成所有業(yè)務(wù)檢查(一致性),預(yù)留必要的業(yè)務(wù)資源(準(zhǔn)隔離性)减宣。
2盐须、Confirm:確認(rèn)執(zhí)行業(yè)務(wù),不再做業(yè)務(wù)檢查漆腌。只使用Try階段預(yù)留的業(yè)務(wù)資源贼邓,Confirm操作滿足冪等性。
3闷尿、Cancel:取消執(zhí)行業(yè)務(wù)釋放Try階段預(yù)留業(yè)務(wù)資源塑径。
TCC流程
一個(gè)完整的業(yè)務(wù)活動(dòng)由一個(gè)主業(yè)務(wù)服務(wù)與若干子業(yè)務(wù)服務(wù)組成:
1、主業(yè)務(wù)服務(wù)負(fù)責(zé)發(fā)起并完成整個(gè)業(yè)務(wù)活動(dòng)
2填具、業(yè)務(wù)服務(wù)提供TCC型業(yè)務(wù)操作统舀。
3、業(yè)務(wù)活動(dòng)管理器控制業(yè)務(wù)活動(dòng)的一致性,它登記業(yè)務(wù)活動(dòng)中的操作绑咱,并在業(yè)務(wù)活動(dòng)提交時(shí)確認(rèn)所有的TCC型操作的Confirm操作绰筛,在業(yè)務(wù)活動(dòng)取消時(shí)調(diào)用所有TCC型操作的Cancel操作。
在Confirm和Cancel范圍內(nèi)的操作成功性需要框架來保證描融,只能一直重試保證資源被消耗或者釋放。
TCC和2PC對比
TCC將事務(wù)提交劃分成兩個(gè)階段衡蚂,Try即為一階段窿克,Confirm 和 Cancel 是二階段并行的兩個(gè)分支,二選一毛甲。從階段劃分上非常像
2PC年叮,我們是否可以說TCC是一種2PC或者2PC變種呢?其實(shí)不可以玻募,原因如下:
1只损、2PC的操作對象在于資源層,對于開發(fā)人員無感知七咧;而TCC的操作在于業(yè)務(wù)層跃惫,具有較高開發(fā)成本。
2艾栋、2PC是一個(gè)整體的長事務(wù)爆存,也是剛性事務(wù);而TCC是一組的本地短事務(wù)蝗砾,是柔性事務(wù)先较。
3、2PC的Prepare(表決階段)進(jìn)行了事務(wù)準(zhǔn)備(redolog悼粮、undolog)闲勺;而TCC的Try兼?zhèn)滟Y源操作與準(zhǔn)備能力
4、2PC是全局鎖定資源扣猫,所有參與者阻塞 交互等待TM通知菜循;而TCC的資源鎖定在于Try操作,業(yè)務(wù)方可以靈活選擇業(yè)務(wù)資源的鎖定粒度苞笨。
TCC注意事項(xiàng)
TCC為了解決網(wǎng)絡(luò)不可靠引起的異常情況债朵,要求業(yè)務(wù)方在設(shè)計(jì)上要遵循三個(gè)策略:
1、允許空回滾:原因是異常發(fā)生在階段一時(shí)瀑凝,部分參與方?jīng)]有收到 Try 請求從而觸發(fā)整個(gè)事務(wù)的Cancel 操作序芦;Try 失敗或者沒有執(zhí)行 Try 操作的參與方收到 Cancel 請求時(shí),要進(jìn)行空回滾操作粤咪。
2谚中、保持冪等性:原因是異常發(fā)生在階段二時(shí),比如網(wǎng)絡(luò)超時(shí),則會重復(fù)調(diào)用參與方的 Confirm/Cancel 方法宪塔,因此Confirm/Cancel方法必須保證冪等性磁奖。
3、防止資源懸掛:原因網(wǎng)絡(luò)異常導(dǎo)致兩個(gè)階段無法保證嚴(yán)格的順序執(zhí)行某筐,出現(xiàn)參與方側(cè) Try 請求比 Cancel 請求更晚到達(dá)的情況比搭,Cancel 會執(zhí)行空回滾而確保事務(wù)的正確性,但是此時(shí) Try 方法也不可以再被執(zhí)行南誊。