分布式事務(wù):
https://kaimingwan.com/post/fen-bu-shi/fen-bu-shi-shi-wu-de-dian-xing-chu-li-fang-shi-2pc-tcc-yi-bu-que-bao-he-zui-da-nu-li-xing
https://www.zhihu.com/question/31813039/answer/308847840
http://www.hollischuang.com/archives/1658
單數(shù)據(jù)庫事務(wù)完全遵循ACID規(guī)范,屬于剛性事務(wù),
分布式事務(wù)要完全遵循ACID規(guī)范比較困難, 分布式事務(wù)屬于柔性事務(wù),滿足BASE理論;
BASE描述: BA(Basic Availability 基本業(yè)務(wù)可用性)、S(Soft state 柔性狀態(tài))、E(Eventual consistency 最終一致性);
現(xiàn)在業(yè)內(nèi)比較常用的分布式事務(wù)解決方案主要有異步消息確保型、TCC、最大努力通知等。
柔性事務(wù)和剛性事務(wù):
柔性事務(wù)滿足BASE理論(基本可用,最終一致)
剛性事務(wù)滿足ACID理論
分布式事務(wù)的典型處理方式:
2PC、TCC、異步確保和最大努力型
柔性事務(wù):
兩階段提交(2PC)型
事務(wù)補(bǔ)償型(TCC事務(wù))
異步確保型
最大努力型
1、兩階段型
就是分布式事務(wù)兩階段提交,對(duì)應(yīng)技術(shù)上的XA、JTA/JTS,這是分布式環(huán)境下事務(wù)處理的典型模式。
2、補(bǔ)償型
TCC型事務(wù)(Try/Confirm/Cancel)可以歸為補(bǔ)償型;
TCC思路是:盡早釋放鎖;在Try成功的情況下,如果事務(wù)要回滾,Cancel將作為一個(gè)補(bǔ)償機(jī)制,回滾Try操作;
TCC各操作事務(wù)本地化,且盡早提交 (放棄兩階段約束);當(dāng)全局事務(wù)要求回滾時(shí),通過另一個(gè)本地事務(wù)實(shí)現(xiàn)“補(bǔ)償”行為;
TCC是將資源層的兩階段提交協(xié)議轉(zhuǎn)換到業(yè)務(wù)層,成為業(yè)務(wù)模型中的一部分;
3、異步確保型
將一些同步阻塞的事務(wù)操作變?yōu)楫惒降牟僮鳎苊鈱?duì)數(shù)據(jù)庫事務(wù)的爭(zhēng)用;比如消息事務(wù)機(jī)制;
如,訂單提交后的短信通知,將之前的阻塞操作變?yōu)楫惒?,消息?duì)列處理
4、最大努力通知型
通過通知服務(wù)器(消息通知)進(jìn)行,允許失敗,有補(bǔ)充機(jī)制;
如,支付成功,支付回調(diào),直到響應(yīng)成功
TCC:
https://my.oschina.net/fileoptions/blog/899991
Try: 嘗試執(zhí)行業(yè)務(wù)
完成所有業(yè)務(wù)檢查(一致性)
預(yù)留必須業(yè)務(wù)資源(準(zhǔn)隔離性)
Confirm:確認(rèn)執(zhí)行業(yè)務(wù)
真正執(zhí)行業(yè)務(wù),不作任何業(yè)務(wù)檢查
只使用Try階段預(yù)留的業(yè)務(wù)資源
Confirm操作要滿足冪等性
Cancel: 取消執(zhí)行業(yè)務(wù)
釋放Try階段預(yù)留的業(yè)務(wù)資源
Cancel操作要滿足冪等性
TCC與2PC協(xié)議比較:
位于業(yè)務(wù)服務(wù)層而非資源層
沒有單獨(dú)的準(zhǔn)備(Prepare)階段, Try操作兼?zhèn)滟Y源操作與準(zhǔn)備能力
Try操作可以靈活選擇業(yè)務(wù)資源的鎖定粒度(以業(yè)務(wù)定粒度)
較高開發(fā)成本
TCC示例:
分別位于三個(gè)不同分庫的帳戶A、B、C,A和B一起向C轉(zhuǎn)帳共80元:分布式事務(wù)之說說TCC事務(wù)
1、Try:嘗試執(zhí)行業(yè)務(wù)。
完成所有業(yè)務(wù)檢查(一致性):檢查A、B、C的帳戶狀態(tài)是否正常,帳戶A的余額是否不少于30元,帳戶B的余額是否不少于50元。
預(yù)留必須業(yè)務(wù)資源(準(zhǔn)隔離性):帳戶A的凍結(jié)金額增加30元,帳戶B的凍結(jié)金額增加50元,這樣就保證不會(huì)出現(xiàn)其他并發(fā)進(jìn)程扣減了這兩個(gè)帳戶的余額而導(dǎo)致在后續(xù)的真正轉(zhuǎn)帳操作過程中,帳戶A和B的可用余額不夠的情況。
2、Confirm:確認(rèn)執(zhí)行業(yè)務(wù)。
真正執(zhí)行業(yè)務(wù):如果Try階段帳戶A、B、C狀態(tài)正常,且?guī)鬉、B余額夠用,則執(zhí)行帳戶A給賬戶C轉(zhuǎn)賬30元、帳戶B給賬戶C轉(zhuǎn)賬50元的轉(zhuǎn)帳操作。
不做任何業(yè)務(wù)檢查:這時(shí)已經(jīng)不需要做業(yè)務(wù)檢查,Try階段已經(jīng)完成了業(yè)務(wù)檢查。
只使用Try階段預(yù)留的業(yè)務(wù)資源:只需要使用Try階段帳戶A和帳戶B凍結(jié)的金額即可。
3、Cancel:取消執(zhí)行業(yè)務(wù)
釋放Try階段預(yù)留的業(yè)務(wù)資源:如果Try階段部分成功,比如帳戶A的余額夠用,且凍結(jié)相應(yīng)金額成功,帳戶B的余額不夠而凍結(jié)失敗,則需要對(duì)帳戶A做Cancel操作,將帳戶A被凍結(jié)的金額解凍掉。