TCC 模式
https://blog.csdn.net/qq_42332821/article/details/104410584
TCC 模式需要用戶根據(jù)自己的業(yè)務(wù)場景實(shí)現(xiàn) Try、Confirm 和 Cancel 三個(gè)操作饿悬;事務(wù)發(fā)起方在一階段執(zhí)行 Try 方式令蛉,在二階段提交執(zhí)行 Confirm 方法,二階段回滾執(zhí)行 Cancel 方法乡恕。
TCC 三個(gè)方法描述:
Try:資源的檢測和預(yù)留言询;
Confirm:執(zhí)行的業(yè)務(wù)操作提交俯萎;要求 Try 成功 Confirm 一定要能成功;
Cancel:預(yù)留資源釋放运杭;
TCC 的實(shí)踐經(jīng)驗(yàn)
螞蟻金服TCC實(shí)踐,總結(jié)以下注意事項(xiàng):
? 業(yè)務(wù)模型分2階段設(shè)計(jì)
? 并發(fā)控制
? 允許空回滾
? 防懸掛控制
? 冪等控制
1 TCC 設(shè)計(jì) - 業(yè)務(wù)模型分 2 階段設(shè)計(jì)
用戶接入 TCC 夫啊,最重要的是考慮如何將自己的業(yè)務(wù)模型拆成兩階段來實(shí)現(xiàn)。
以“扣錢”場景為例辆憔,在接入 TCC 前撇眯,對 A 賬戶的扣錢,只需一條更新賬戶余額的 SQL 便能完成虱咧;但是在接入 TCC 之后熊榛,用戶就需要考慮如何將原來一步就能完成的扣錢操作,拆成兩階段腕巡,實(shí)現(xiàn)成三個(gè)方法玄坦,并且保證一階段 Try 成功的話 二階段 Confirm 一定能成功。
如上圖所示绘沉,Try 方法作為一階段準(zhǔn)備方法煎楣,需要做資源的檢查和預(yù)留。在扣錢場景下车伞,Try 要做的事情是就是檢查賬戶余額是否充足择懂,預(yù)留轉(zhuǎn)賬資金,預(yù)留的方式就是凍結(jié) A 賬戶的 轉(zhuǎn)賬資金另玖。Try 方法執(zhí)行之后困曙,賬號 A 余額雖然還是 100,但是其中 30 元已經(jīng)被凍結(jié)了谦去,不能被其他事務(wù)使用慷丽。
二階段 Confirm 方法執(zhí)行真正的扣錢操作。Confirm 會(huì)使用 Try 階段凍結(jié)的資金哪轿,執(zhí)行賬號扣款盈魁。Confirm 方法執(zhí)行之后,賬號 A 在一階段中凍結(jié)的 30 元已經(jīng)被扣除窃诉,賬號 A 余額變成 70 元 杨耙。
如果二階段是回滾的話,就需要在 Cancel 方法內(nèi)釋放一階段 Try 凍結(jié)的 30 元飘痛,使賬號 A 的回到初始狀態(tài)珊膜,100 元全部可用。
用戶接入 TCC 模式宣脉,最重要的事情就是考慮如何將業(yè)務(wù)模型拆成 2 階段车柠,實(shí)現(xiàn)成 TCC 的 3 個(gè)方法,并且保證 Try 成功 Confirm 一定能成功。相對于 AT 模式竹祷,TCC 模式對業(yè)務(wù)代碼有一定的侵入性谈跛,但是 TCC 模式無 AT 模式的全局行鎖,TCC 性能會(huì)比 AT 模式高很多塑陵。
2 TCC 設(shè)計(jì) - 允許空回滾
Cancel 接口設(shè)計(jì)時(shí)需要允許空回滾感憾。在 Try 接口因?yàn)閬G包時(shí)沒有收到,事務(wù)管理器會(huì)觸發(fā)回滾令花,這時(shí)會(huì)觸發(fā) Cancel 接口阻桅,這時(shí) Cancel 執(zhí)行時(shí)發(fā)現(xiàn)沒有對應(yīng)的事務(wù) xid 或主鍵時(shí),需要返回回滾成功兼都。讓事務(wù)服務(wù)管理器認(rèn)為已回滾嫂沉,否則會(huì)不斷重試,而 Cancel 又沒有對應(yīng)的業(yè)務(wù)數(shù)據(jù)可以進(jìn)行回滾扮碧。
3 TCC 設(shè)計(jì) - 防懸掛控制
懸掛的意思是:Cancel 比 Try 接口先執(zhí)行趟章,出現(xiàn)的原因是 Try 由于網(wǎng)絡(luò)擁堵而超時(shí),事務(wù)管理器生成回滾慎王,觸發(fā) Cancel 接口尤揣,而最終又收到了 Try 接口調(diào)用,但是 Cancel 比 Try 先到柬祠。按照前面允許空回滾的邏輯,回滾會(huì)返回成功负芋,事務(wù)管理器認(rèn)為事務(wù)已回滾成功漫蛔,則此時(shí)的 Try 接口不應(yīng)該執(zhí)行,否則會(huì)產(chǎn)生數(shù)據(jù)不一致旧蛾,所以我們在 Cancel 空回滾返回成功之前先記錄該條事務(wù) xid 或業(yè)務(wù)主鍵莽龟,標(biāo)識這條記錄已經(jīng)回滾過,Try 接口先檢查這條事務(wù)xid或業(yè)務(wù)主鍵如果已經(jīng)標(biāo)記為回滾成功過锨天,則不執(zhí)行 Try 的業(yè)務(wù)操作毯盈。
4 TCC 設(shè)計(jì) - 冪等控制
冪等性的意思是:對同一個(gè)系統(tǒng),使用同樣的條件病袄,一次請求和重復(fù)的多次請求對系統(tǒng)資源的影響是一致的搂赋。因?yàn)榫W(wǎng)絡(luò)抖動(dòng)或擁堵可能會(huì)超時(shí),事務(wù)管理器會(huì)對資源進(jìn)行重試操作益缠,所以很可能一個(gè)業(yè)務(wù)操作會(huì)被重復(fù)調(diào)用脑奠,為了不因?yàn)橹貜?fù)調(diào)用而多次占用資源,需要對服務(wù)設(shè)計(jì)時(shí)進(jìn)行冪等控制幅慌,通常我們可以用事務(wù) xid 或業(yè)務(wù)主鍵判重來控制宋欺。