分布式事務(wù)- TCC編程式模式

一、前言

嚴(yán)格遵守ACID的分布式事務(wù)我們稱為剛性事務(wù)快集,而遵循BASE理論(基本可用:在故障出現(xiàn)時(shí)保證核心功能可用笛臣,軟狀態(tài):允許中間狀態(tài)出現(xiàn),最終一致性:不要求分布式事務(wù)打成中時(shí)間點(diǎn)數(shù)據(jù)都是一致性的尸饺,但是保證達(dá)到某個(gè)時(shí)間點(diǎn)后进统,數(shù)據(jù)就處于了一致性了)的事務(wù)我們稱為柔性事務(wù),其中TCC編程模式就屬于柔性事務(wù)浪听,本文我們來闡述其理論螟碎。

二、TCC編程模式

TCC編程模式本質(zhì)上也是一種二階段協(xié)議迹栓,不同在于TCC編程模式需要與具體業(yè)務(wù)耦合掉分,下面首先看下TCC編程模式步驟:

  • 所有事務(wù)參與方都需要實(shí)現(xiàn)try,confirm,cancle接口足陨。

  • 事務(wù)發(fā)起方向事務(wù)協(xié)調(diào)器發(fā)起事務(wù)請求孽糖,事務(wù)協(xié)調(diào)器調(diào)用所有事務(wù)參與者的try方法完成資源的預(yù)留,這時(shí)候并沒有真正執(zhí)行業(yè)務(wù)撞叨,而是為后面具體要執(zhí)行的業(yè)務(wù)預(yù)留資源愿吹,這里完成了一階段不从。

  • 如果事務(wù)協(xié)調(diào)器發(fā)現(xiàn)有參與者的try方法預(yù)留資源時(shí)候發(fā)現(xiàn)資源不夠,則調(diào)用參與方的cancle方法回滾預(yù)留的資源犁跪,需要注意cancle方法需要實(shí)現(xiàn)業(yè)務(wù)冪等椿息,因?yàn)橛锌赡苷{(diào)用失敗(比如網(wǎng)絡(luò)原因參與者接受到了請求坷衍,但是由于網(wǎng)絡(luò)原因事務(wù)協(xié)調(diào)器沒有接受到回執(zhí))會(huì)重試寝优。

  • 如果事務(wù)協(xié)調(diào)器發(fā)現(xiàn)所有參與者的try方法返回都OK,則事務(wù)協(xié)調(diào)器調(diào)用所有參與者的confirm方法枫耳,不做資源檢查倡勇,直接進(jìn)行具體的業(yè)務(wù)操作。

  • 如果協(xié)調(diào)器發(fā)現(xiàn)所有參與者的confirm方法都OK了嘉涌,則分布式事務(wù)結(jié)束妻熊。

  • 如果協(xié)調(diào)器發(fā)現(xiàn)有些參與者的confirm方法失敗了,或者由于網(wǎng)絡(luò)原因沒有收到回執(zhí)仑最,則協(xié)調(diào)器會(huì)進(jìn)行重試扔役。這里如果重試一定次數(shù)后還是失敗,會(huì)怎么樣那警医?常見的是做事務(wù)補(bǔ)償亿胸。

螞蟻金服基于TCC實(shí)現(xiàn)了XTS(云上叫DTS)坯钦,目前在螞蟻金服云上有對外輸出,這里我們來結(jié)合其提供的一個(gè)例子來具體理解TCC的含義侈玄,以下引入螞蟻金服云實(shí)例:

“首先我們假想這樣一種場景:轉(zhuǎn)賬服務(wù)婉刀,從銀行 A 某個(gè)賬戶轉(zhuǎn) 100 元錢到銀行 B 的某個(gè)賬戶,銀行 A 和銀行 B 可以認(rèn)為是兩個(gè)單獨(dú)的系統(tǒng)序仙,也就是兩套單獨(dú)的數(shù)據(jù)庫突颊。

我們將賬戶系統(tǒng)簡化成只有賬戶和余額 2 個(gè)字段,并且為了適應(yīng) DTS 的兩階段設(shè)計(jì)要求潘悼,業(yè)務(wù)上又增加了一個(gè)凍結(jié)金額(凍結(jié)金額是指在一筆轉(zhuǎn)賬期間律秃,在一階段的時(shí)候使用該字段臨時(shí)存儲轉(zhuǎn)賬金額,該轉(zhuǎn)賬額度不能被使用治唤,只有等這筆分布式事務(wù)全部提交成功時(shí)棒动,才會(huì)真正的計(jì)入可用余額)。按這樣的設(shè)計(jì)宾添,用戶的可用余額等于賬戶余額減去凍結(jié)金額船惨。這點(diǎn)是理解參與者設(shè)計(jì)的關(guān)鍵,也是 DTS 保證最終一致的業(yè)務(wù)約束缕陕×蝗瘢”

在try階段并沒有對銀行A和B數(shù)據(jù)庫中的余額字段做操作,而是對凍結(jié)金額做的操作榄檬,對應(yīng)A銀行預(yù)留資源操作是對凍結(jié)金額加上100元卜范,這時(shí)候A銀行賬號上可用錢為余額字段-凍結(jié)金額衔统;對應(yīng)B銀行的操作是對凍結(jié)金額上減去100鹿榜,這時(shí)候B銀行賬號上可用的錢為余額字段-凍結(jié)金額。

如果事務(wù)協(xié)調(diào)器調(diào)用銀行A和銀行B的try方法有一個(gè)失敗了(比如銀行A的賬戶余額不夠了)锦爵,則調(diào)用cancle進(jìn)行回滾操作(具體是對凍結(jié)金額做反向操作)舱殿。如果調(diào)用try方法都OK了,則進(jìn)入confirm階段险掀,confirm階段則不做資源檢查沪袭,直接做業(yè)務(wù)操作,對應(yīng)銀行A要在賬戶余額減去100樟氢,然后凍金額減去100冈绊;對應(yīng)銀行B要對賬戶余額字段加上100,然后凍結(jié)金額加上100埠啃。

最關(guān)心的死宣,如果confirm階段如果有一個(gè)參與者失敗了,該如何處理碴开,其實(shí)上面操作都是xts-client做的毅该,還有一個(gè)xts-server專門做事務(wù)補(bǔ)償?shù)摹?/p>

三博秫、總結(jié)

TCC是對二階段的一個(gè)改進(jìn),try階段通過預(yù)留資源的方式避免了同步阻塞資源的情況眶掌,但是TCC編程需要業(yè)務(wù)自己實(shí)現(xiàn)try,confirm,cancle方法挡育,對業(yè)務(wù)入侵太大,實(shí)現(xiàn)起來也比較復(fù)雜朴爬。

最后

想了解JDK NIO和更多Netty基礎(chǔ)的可以單擊我
想了解更多關(guān)于粘包半包問題單擊我
更多關(guān)于分布式系統(tǒng)中服務(wù)降級策略的知識可以單擊 單擊我
想系統(tǒng)學(xué)dubbo的單擊我
想學(xué)并發(fā)的童鞋可以 單擊我
想了解SpringBoot核心模塊原理的 單擊我

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末即寒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寝殴,更是在濱河造成了極大的恐慌蒿叠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚣常,死亡現(xiàn)場離奇詭異市咽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抵蚊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門施绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贞绳,你說我怎么就攤上這事谷醉。” “怎么了冈闭?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵俱尼,是天一觀的道長。 經(jīng)常有香客問我萎攒,道長遇八,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任耍休,我火速辦了婚禮刃永,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羊精。我一直安慰自己斯够,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布喧锦。 她就那樣靜靜地躺著读规,像睡著了一般。 火紅的嫁衣襯著肌膚如雪燃少。 梳的紋絲不亂的頭發(fā)上束亏,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機(jī)與錄音供汛,去河邊找鬼枪汪。 笑死涌穆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雀久。 我是一名探鬼主播宿稀,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赖捌!你這毒婦竟也來了祝沸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤越庇,失蹤者是張志新(化名)和其女友劉穎罩锐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卤唉,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涩惑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桑驱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竭恬。...
    茶點(diǎn)故事閱讀 40,742評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖熬的,靈堂內(nèi)的尸體忽然破棺而出痊硕,到底是詐尸還是另有隱情,我是刑警寧澤押框,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布岔绸,位于F島的核電站,受9級特大地震影響橡伞,放射性物質(zhì)發(fā)生泄漏盒揉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一骑歹、第九天 我趴在偏房一處隱蔽的房頂上張望预烙。 院中可真熱鬧墨微,春花似錦道媚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锈麸,卻和暖如春镀脂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忘伞。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工薄翅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沙兰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓翘魄,卻偏偏與公主長得像鼎天,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子暑竟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容

  • TCC事務(wù)模型雖然說起來簡單斋射,然而要基于TCC實(shí)現(xiàn)一個(gè)通用的分布式事務(wù)框架,卻比它看上去要復(fù)雜的多但荤,不只是簡單的調(diào)...
    阿斯蒂芬2閱讀 3,710評論 0 2
  • 本文歡迎轉(zhuǎn)載罗岖,轉(zhuǎn)載請注明原文鏈接,并附作者個(gè)人信息李艷鵬腹躁。 1 背景 一致性是一個(gè)抽象的桑包、具有多重含義的計(jì)算機(jī)術(shù)語...
    581f548ef0ec閱讀 43,546評論 28 295
  • 在高并發(fā)場景下,分布式儲存和處理已經(jīng)是常用手段纺非。但分布式的結(jié)構(gòu)勢必會(huì)帶來“不一致”的麻煩問題捡多,而事務(wù)正是解決這一問...
    MarkyLumin閱讀 28,871評論 2 30
  • celebratory gunfire embezzlement rulling 判決 recapture 收復(fù)
    c花海閱讀 166評論 0 0
  • 早上女兒準(zhǔn)備出門上學(xué),我告訴她铐炫,今天天氣預(yù)報(bào)報(bào)的有雨垒手,帶把傘。孩子拿了傘準(zhǔn)備出門倒信,孩子奶奶看見了說:拿什么傘...
    從容自由閱讀 215評論 0 3