分布式事務(wù)

事務(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í)行南誊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末身诺,一起剝皮案震驚了整個(gè)濱河市匀们,隨后出現(xiàn)的幾起案子拇勃,更是在濱河造成了極大的恐慌,老刑警劉巖颤陶,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幔托,死亡現(xiàn)場離奇詭異穴亏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)重挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門嗓化,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攒驰,你說我怎么就攤上這事蟆湖。” “怎么了玻粪?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵隅津,是天一觀的道長。 經(jīng)常有香客問我劲室,道長伦仍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任很洋,我火速辦了婚禮充蓝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喉磁。我一直安慰自己谓苟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布协怒。 她就那樣靜靜地躺著涝焙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪孕暇。 梳的紋絲不亂的頭發(fā)上仑撞,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天赤兴,我揣著相機(jī)與錄音,去河邊找鬼隧哮。 笑死桶良,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沮翔。 我是一名探鬼主播陨帆,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鉴竭!你這毒婦竟也來了歧譬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤搏存,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矢洲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧眠,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年读虏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了责静。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盖桥,死狀恐怖灾螃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揩徊,我是刑警寧澤腰鬼,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站塑荒,受9級特大地震影響熄赡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜齿税,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一彼硫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凌箕,春花似錦拧篮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仆葡,卻和暖如春赏参,著一層夾襖步出監(jiān)牢的瞬間志笼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工把篓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纫溃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓韧掩,卻偏偏與公主長得像紊浩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子疗锐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361