面試官:億級(jí)流量架構(gòu)分布式事務(wù)如何實(shí)現(xiàn)?我懵了。。
300本計(jì)算機(jī)編程的經(jīng)典書籍下載
AI全套:Python3+TensorFlow打造人臉識(shí)別智能小程序
最新人工智能資料-Google工程師親授 Tensorflow-入門到進(jìn)階
黑馬頭條項(xiàng)目 - Java Springboot2.0(視頻、資料、代碼和講義)14天完整版
作者:等不到的口琴
來源:www.cnblogs.com/Courage129/p/14433462.html面試官:億級(jí)流量架構(gòu)分布式事務(wù)如何實(shí)現(xiàn)?我懵了。。
分布式事務(wù)以及分布式鎖是分布式中難點(diǎn),分布式事務(wù)一篇文章可能寫不完,我的習(xí)慣時(shí)從基本概念出發(fā),一步一步開始介紹,前面會(huì)先梳理事務(wù)中一些基本概念,對(duì)基本概念十分清楚的話可以直接看"一致性討論"以及后面的部分。予己方便總結(jié)回顧、與他交流分享。 什么是分布式事務(wù)
在日常生活中,很多事要么全部做,要么全部不做,不能只做一部分,不然就會(huì)產(chǎn)生其他復(fù)雜的問題,很多人喜歡舉轉(zhuǎn)賬的例子,對(duì)于同一個(gè)賬號(hào),A在湖北往出轉(zhuǎn)500,B在廣東取錢500,那么A轉(zhuǎn)出去之后要將A賬號(hào)的錢數(shù)目扣除,B賬號(hào)數(shù)目增加:?事務(wù) = (A賬號(hào)扣除500,B賬號(hào)增加500) 看到?jīng)],像這樣多個(gè)步驟放在一起,就是事務(wù),要么都執(zhí)行,要么都不執(zhí)行,如果我們的數(shù)據(jù)存儲(chǔ)在多個(gè)數(shù)據(jù)庫中,也就是存在跨庫調(diào)用,由于網(wǎng)絡(luò)具有不安全性以及延時(shí)性,如何保證事務(wù)分布式執(zhí)行呢?如果執(zhí)行到一半斷電又該如何處理?在講解分布式事務(wù)之前先簡單回顧事務(wù)的一些特點(diǎn),俗稱?ACID?,下面逐一講解: 原子性(Atomic)
在化學(xué)中,分子構(gòu)成的物質(zhì),分子是保持化學(xué)特性的最小單位,如 H2O,CO2H2O,CO2 等,由原子構(gòu)成的物質(zhì),原子保持物質(zhì)特性,像 FeFe 啥的,意思就是不可分割,再分成質(zhì)子中子啥的就不是我們認(rèn)為的物質(zhì)了,這兒的原子性也是這個(gè)道理,就是事務(wù)不可以再拆分,例如上面的事務(wù),看著可以是由兩個(gè)過程組成的事務(wù),但是你拆開就不是我們認(rèn)為該有的過程,所以,事務(wù)不可再分,具有原子性。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。
一致性(Consistency)
一致性也很好理解,對(duì)于上面的兩個(gè)賬戶,如果銀行想知道自己這兒被存了多少錢,那么這個(gè)事務(wù)執(zhí)行前,A賬號(hào)有500塊,B賬號(hào)沒有錢,銀行賬戶總共500塊,事務(wù)執(zhí)行后A賬號(hào)沒有錢,B賬號(hào)有500塊,也就是這個(gè)500塊是一定的,不可能出現(xiàn)A賬號(hào)有500塊,B賬號(hào)也有500塊, 那就數(shù)據(jù)不一致了,這樣的話,說明事務(wù)中某些步驟執(zhí)行出現(xiàn)了問題,產(chǎn)生中間數(shù)據(jù),那么就不一致。 在分布式中,對(duì)于一個(gè)結(jié)果,多處同時(shí)查詢,得出的結(jié)果應(yīng)該是一致的。 隔離性(Isolation)
一個(gè)事務(wù)在未完成時(shí),另一個(gè)事務(wù)不會(huì)影響到它,也就是如果B還給C轉(zhuǎn)賬1000,記為事務(wù)2: 事務(wù)1 = (A賬號(hào)扣除500,B賬號(hào)增加500)
事務(wù)2 = (B賬號(hào)扣除1000,C賬號(hào)增加1000)
持久性(Durability)
一致性的討論
ACID本質(zhì)而言都是為了保護(hù)數(shù)據(jù)的一致性,而數(shù)據(jù)數(shù)據(jù)持久化時(shí)會(huì)觸發(fā)數(shù)據(jù)庫操作,造成效率低小,所以圍繞一致性(效率)產(chǎn)生了一些討論,分別是強(qiáng)一致性、弱一致性、最終一致性。 強(qiáng)一致性
任何一次讀都能讀到某個(gè)數(shù)據(jù)的最近一次寫的數(shù)據(jù)。系統(tǒng)中的所有進(jìn)程,看到的操作順序,都和全局時(shí)鐘下的順序一致。簡言之,在任意時(shí)刻,所有節(jié)點(diǎn)中的數(shù)據(jù)是一樣的,這就要求數(shù)據(jù)一有改變就寫到數(shù)據(jù)庫。 弱一致性
數(shù)據(jù)更新后,不要求及時(shí)寫會(huì)數(shù)據(jù)庫以及同步到所有節(jié)點(diǎn),也就是這時(shí)候數(shù)據(jù)與真實(shí)數(shù)據(jù)可能有一些出入,對(duì)于架構(gòu)而言,如果能容忍后續(xù)的訪問只能訪問到部分或者全部訪問不到,則是弱一致性。 最終一致性
不保證在任意時(shí)刻任意節(jié)點(diǎn)上的同一份數(shù)據(jù)都是相同的,也就是有些節(jié)點(diǎn)數(shù)據(jù)可能是準(zhǔn)確的,有的可能是不準(zhǔn)確的, 但是隨著時(shí)間的遷移,不同節(jié)點(diǎn)上的同一份數(shù)據(jù)總是在向趨同的方向變化。簡單說,就是在一段時(shí)間后,節(jié)點(diǎn)間的數(shù)據(jù)會(huì)最終達(dá)到一致狀態(tài)。 分庫分表
前面講過集群的AKF拆分原則( Redis集群拆分原則之AKF ),大概意思是硬件性能是由上限的,當(dāng)硬件沒法支撐請(qǐng)求流量時(shí),可以將流量分發(fā)到不同的服務(wù)器上,AKF拆分之Y軸、Z軸拆分是業(yè)務(wù)拆分與數(shù)據(jù)拆分,那也就會(huì)涉及到將數(shù)據(jù)庫中的數(shù)據(jù)拆分存儲(chǔ)在不同的地方,這就叫分庫分表,不同類型數(shù)據(jù)存儲(chǔ)在不同數(shù)據(jù)庫中做多機(jī)存儲(chǔ)和負(fù)載,這樣一來,傳統(tǒng)的事務(wù)機(jī)制ACID便無法正常運(yùn)行。 分庫分表內(nèi)容是數(shù)據(jù)切分(Sharding),以及切分后對(duì)數(shù)據(jù)的定位、整合。具體來說, 數(shù)據(jù)切分就是將數(shù)據(jù)分散存儲(chǔ)到多個(gè)數(shù)據(jù)庫中,使得單一數(shù)據(jù)庫中的數(shù)據(jù)量變小,通過擴(kuò)充主機(jī)的數(shù)量緩解單一數(shù)據(jù)庫性能問題,從而達(dá)到提升數(shù)據(jù)庫操作性能的目的。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。 數(shù)據(jù)切分根據(jù)其切分類型,可以分為兩種方式:垂直(縱向)切分和水平(橫向)切分。 垂直拆分
垂直切分常見有垂直分庫和垂直分表兩種,兩種含義類似。
垂直分表類似,例如將一張表包含一個(gè)人所有信息,例如姓名、身份證、性別、身高、體重、省、市、區(qū)、村、專業(yè)、G點(diǎn)等等,那么可以拆分成三個(gè)表: 第一個(gè)表只包含基本信息(姓名、身份證、性別、身高、體重);
第三個(gè)表包含學(xué)習(xí)信息(專業(yè)、G點(diǎn))。
垂直拆分優(yōu)缺點(diǎn)
垂直切分的優(yōu)點(diǎn):
與微服務(wù)的治理類似,也能對(duì)不同業(yè)務(wù)的數(shù)據(jù)進(jìn)行分級(jí)管理、維護(hù)、監(jiān)控、擴(kuò)展等
高并發(fā)場(chǎng)景下,垂直切分一定程度的提升IO、數(shù)據(jù)庫連接數(shù)、單機(jī)硬件資源的瓶頸
水平拆分

除了上面按照用戶ID區(qū)間拆分,也可以做Hash運(yùn)算拆分,這兒就不詳細(xì)展開了。另外,分庫分表系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。
水平拆分優(yōu)缺點(diǎn)
水平拆分優(yōu)點(diǎn)在于:
單表大小可控 天然便于水平擴(kuò)展,后期如果想對(duì)整個(gè)分片集群擴(kuò)容時(shí),只需要添加節(jié)點(diǎn)即可,無需對(duì)其他分片的數(shù)據(jù)進(jìn)行遷移 使用分片字段進(jìn)行范圍查找時(shí),連續(xù)分片可快速定位分片進(jìn)行快速查詢,有效避免跨分片查詢的問題。
熱點(diǎn)數(shù)據(jù)成為性能瓶頸。連續(xù)分片可能存在數(shù)據(jù)熱點(diǎn),例如按時(shí)間字段分片,有些分片存儲(chǔ)最近時(shí)間段內(nèi)的數(shù)據(jù),可能會(huì)被頻繁的讀寫,而有些分片存儲(chǔ)的歷史數(shù)據(jù),則很少被查詢
分庫分表帶來的問題
跨分片事務(wù)也是分布式事務(wù),沒有簡單的方案,一般可使用"XA協(xié)議"和"兩階段提交"處理。
分布式事務(wù)能最大限度保證了數(shù)據(jù)庫操作的原子性。但在提交事務(wù)時(shí)需要協(xié)調(diào)多個(gè)節(jié)點(diǎn),推后了提交事務(wù)的時(shí)間點(diǎn),延長了事務(wù)的執(zhí)行時(shí)間。導(dǎo)致事務(wù)在訪問共享資源時(shí)發(fā)生沖突或死鎖的概率增高。隨著數(shù)據(jù)庫節(jié)點(diǎn)的增多,這種趨勢(shì)會(huì)越來越嚴(yán)重,從而成為系統(tǒng)在數(shù)據(jù)庫層面上水平擴(kuò)展的枷鎖。
最終一致性
分布式事務(wù)解決思路
講這個(gè)之前需要先簡單回顧C(jī)AP原則和Base理論,因?yàn)榉植际绞聞?wù)不同于 ACID 的剛性事務(wù),在分布式場(chǎng)景下基于 BASE 理論,提出了柔性事務(wù)的概念。要想通過柔性事務(wù)來達(dá)到最終的一致性,就需要依賴于一些特性,這些特性在具體的方案中不一定都要滿足,因?yàn)椴煌姆桨敢蟛灰粯?;但是都不滿足的話,是不可能做柔性事務(wù)的。
CAP原則
相當(dāng)于是對(duì)之前三選二說法進(jìn)行修正,CAP中P(分區(qū)容錯(cuò)性)是必須具備的,在滿足P的前提下,很難同時(shí)滿足A(可用性)和C(一致性),但是在之后,又有一篇文章: Harvest, yield, and scalable tolerant systems ,這篇論文是基于上面那篇“CAP 12年后”的論文寫的,它主要提出了 Harvest 和 Yield 概念,并把上面那篇論文中所討論的東西講得更為仔細(xì)了一些。簡單來說就是滿足P之后,C和A在放寬約束后可以得到兼顧,并不是非此即彼的關(guān)系,說遠(yuǎn)了。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。
為什么P是必須的?
為什么CAP原則中分區(qū)容錯(cuò)性是必須的呢,首先要理解什么是分區(qū)容錯(cuò)性,分區(qū),這兒說的是網(wǎng)絡(luò),網(wǎng)絡(luò)集群設(shè)計(jì)到很多的服務(wù)器,某一瞬間網(wǎng)絡(luò)不穩(wěn)定,那么相當(dāng)于將網(wǎng)絡(luò)分成了不同的區(qū),假設(shè)分成了兩個(gè)區(qū),這時(shí)候如果有一筆交易:
對(duì)分區(qū)一發(fā)出消息:A給B轉(zhuǎn)賬100元,對(duì)分區(qū)二發(fā)出消息:A給B轉(zhuǎn)賬200元
那么對(duì)于兩個(gè)分區(qū)而言,有兩種情況:
a)無可用性,即這兩筆交易至少會(huì)有一筆交易不會(huì)被接受;
b)無一致性,一半看到的是 A給B轉(zhuǎn)賬100元而另一半則看到 A給B轉(zhuǎn)賬200元。
所以,分區(qū)容忍性必須要滿足,解決策略是一個(gè)數(shù)據(jù)項(xiàng)復(fù)制到多個(gè)節(jié)點(diǎn)上,那么出現(xiàn)分區(qū)之后,這一數(shù)據(jù)項(xiàng)就可能分布到各個(gè)區(qū)里。容忍性就提高了。
Base理論
BASE理論是Basically Available(基本可用),Soft State(軟狀態(tài))和Eventually Consistent(最終一致性)三個(gè)短語的縮寫。
基本可用
假設(shè)系統(tǒng),出現(xiàn)了不可預(yù)知的故障,但還是能用,相比較正常的系統(tǒng)而言:
響應(yīng)時(shí)間上的損失?:正常情況下的搜索引擎0.5秒即返回給用戶結(jié)果,而基本可用的搜索引擎可以在2秒作用返回結(jié)果。
功能上的損失?:在一個(gè)電商網(wǎng)站上,正常情況下,用戶可以順利完成每一筆訂單。但是到了大促期間,為了保護(hù)購物系統(tǒng)的穩(wěn)定性,部分消費(fèi)者可能會(huì)被引導(dǎo)到一個(gè)降級(jí)頁面。
軟狀態(tài)
最終一致性
Base其核心思想是:
既然無法做到強(qiáng)一致性(Strong consistency),但每個(gè)應(yīng)用都可以根據(jù)自身的業(yè)務(wù)特點(diǎn),采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終一致性(Eventual consistency)。有了Base理論就可以開始講述分布式事務(wù)的處理思路了。
二階段提交協(xié)議
第一階段:投票
該階段的主要目的在于打探數(shù)據(jù)庫集群中的各個(gè)參與者是否能夠正常的執(zhí)行事務(wù),具體步驟如下:
協(xié)調(diào)者向所有的參與者發(fā)送事務(wù)執(zhí)行請(qǐng)求,并等待參與者反饋事務(wù)執(zhí)行結(jié)果; 事務(wù)參與者收到請(qǐng)求之后,執(zhí)行事務(wù)但不提交,并記錄事務(wù)日志; 參與者將自己事務(wù)執(zhí)行情況反饋給協(xié)調(diào)者,同時(shí)阻塞等待協(xié)調(diào)者的后續(xù)指令。
第二階段:事務(wù)提交
在經(jīng)過第一階段協(xié)調(diào)者的詢盤之后,各個(gè)參與者會(huì)回復(fù)自己事務(wù)的執(zhí)行情況,這時(shí)候存在 3 種可能性:
所有的參與者都回復(fù)能夠正常執(zhí)行事務(wù)。 一個(gè)或多個(gè)參與者回復(fù)事務(wù)執(zhí)行失敗。 協(xié)調(diào)者等待超時(shí)。
協(xié)調(diào)者向各個(gè)參與者發(fā)送 commit 通知,請(qǐng)求提交事務(wù); 參與者收到事務(wù)提交通知之后執(zhí)行 commit 操作,然后釋放占有的資源; 參與者向協(xié)調(diào)者返回事務(wù) commit 結(jié)果信息。
對(duì)于第 2 和第 3 種情況,協(xié)調(diào)者均認(rèn)為參與者無法成功執(zhí)行事務(wù),為了整個(gè)集群數(shù)據(jù)的一致性,所以要向各個(gè)參與者發(fā)送事務(wù)回滾通知,具體步驟如下:
協(xié)調(diào)者向各個(gè)參與者發(fā)送事務(wù) rollback 通知,請(qǐng)求回滾事務(wù); 參與者收到事務(wù)回滾通知之后執(zhí)行 rollback 操作,然后釋放占有的資源; 參與者向協(xié)調(diào)者返回事務(wù) rollback 結(jié)果信息。
兩階段提交協(xié)議解決的是分布式數(shù)據(jù)庫數(shù)據(jù)強(qiáng)一致性問題,實(shí)際應(yīng)用中更多的是用來解決事務(wù)操作的原子性,下圖描繪了協(xié)調(diào)者與參與者的狀態(tài)轉(zhuǎn)換。

站在協(xié)調(diào)者的角度,在發(fā)起投票之后就進(jìn)入了 WAIT 等待狀態(tài),等待所有參與者回復(fù)各自事務(wù)執(zhí)行狀態(tài),并在收到所有參與者的回復(fù)后決策下一步是發(fā)送 commit提交 或 rollback回滾信息。
兩階段提交協(xié)議原理簡單、易于實(shí)現(xiàn),但是缺點(diǎn)也是顯而易見的,包含如下:
單點(diǎn)問題
協(xié)調(diào)者在整個(gè)兩階段提交過程中扮演著舉足輕重的作用,一旦協(xié)調(diào)者所在服務(wù)器宕機(jī),就會(huì)影響整個(gè)數(shù)據(jù)庫集群的正常運(yùn)行。比如在第二階段中,如果協(xié)調(diào)者因?yàn)楣收喜荒苷0l(fā)送事務(wù)提交或回滾通知,那么參與者們將一直處于阻塞狀態(tài),整個(gè)數(shù)據(jù)庫集群將無法提供服務(wù)。
同步阻塞
兩階段提交執(zhí)行過程中,所有的參與者都需要聽從協(xié)調(diào)者的統(tǒng)一調(diào)度,期間處于阻塞狀態(tài)而不能從事其他操作,這樣效率極其低下。
數(shù)據(jù)不一致性
針對(duì)上述問題可以引入 超時(shí)機(jī)制 和 互詢機(jī)制在很大程度上予以解決。
超時(shí)機(jī)制
對(duì)于協(xié)調(diào)者來說如果在指定時(shí)間內(nèi)沒有收到所有參與者的應(yīng)答,則可以自動(dòng)退出 WAIT 狀態(tài),并向所有參與者發(fā)送 rollback 通知。對(duì)于參與者來說如果位于 READY 狀態(tài),但是在指定時(shí)間內(nèi)沒有收到協(xié)調(diào)者的第二階段通知,則不能武斷地執(zhí)行 rollback 操作,因?yàn)閰f(xié)調(diào)者可能發(fā)送的是 commit 通知,這個(gè)時(shí)候執(zhí)行 rollback 就會(huì)導(dǎo)致數(shù)據(jù)不一致。
互詢機(jī)制
三階段提交協(xié)議

第一階段:預(yù)詢盤
該階段協(xié)調(diào)者會(huì)去詢問各個(gè)參與者是否能夠正常執(zhí)行事務(wù),參與者根據(jù)自身情況回復(fù)一個(gè)預(yù)估值,相對(duì)于真正的執(zhí)行事務(wù),這個(gè)過程是輕量的,具體步驟如下:
協(xié)調(diào)者向各個(gè)參與者發(fā)送事務(wù)詢問通知,詢問是否可以執(zhí)行事務(wù)操作,并等待回復(fù); 各個(gè)參與者依據(jù)自身狀況回復(fù)一個(gè)預(yù)估值,如果預(yù)估自己能夠正常執(zhí)行事務(wù)就返回確定信息,并進(jìn)入預(yù)備狀態(tài),否則返回否定信息。
第二階段:預(yù)提交
本階段協(xié)調(diào)者會(huì)根據(jù)第一階段的詢盤結(jié)果采取相應(yīng)操作,詢盤結(jié)果主要有 3 種:
所有的參與者都返回確定信息。 一個(gè)或多個(gè)參與者返回否定信息。 協(xié)調(diào)者等待超時(shí)。
針對(duì)第 1 種情況,協(xié)調(diào)者會(huì)向所有參與者發(fā)送事務(wù)執(zhí)行請(qǐng)求,具體步驟如下:
協(xié)調(diào)者向所有的事務(wù)參與者發(fā)送事務(wù)執(zhí)行通知; 參與者收到通知后執(zhí)行事務(wù)但不提交; 參與者將事務(wù)執(zhí)行情況返回給客戶端。
協(xié)調(diào)者向所有事務(wù)參與者發(fā)送 abort 通知; 參與者收到通知后中斷事務(wù)。

第三階段:事務(wù)提交
如果第二階段事務(wù)未中斷,那么本階段協(xié)調(diào)者將會(huì)依據(jù)事務(wù)執(zhí)行返回的結(jié)果來決定提交或回滾事務(wù),分為 3 種情況:
所有的參與者都能正常執(zhí)行事務(wù)。 一個(gè)或多個(gè)參與者執(zhí)行事務(wù)失敗。 協(xié)調(diào)者等待超時(shí)。
針對(duì)第 1 種情況,協(xié)調(diào)者向各個(gè)參與者發(fā)起事務(wù)提交請(qǐng)求,具體步驟如下:
協(xié)調(diào)者向所有參與者發(fā)送事務(wù) commit 通知; 所有參與者在收到通知之后執(zhí)行 commit 操作,并釋放占有的資源; 參與者向協(xié)調(diào)者反饋事務(wù)提交結(jié)果。

協(xié)調(diào)者向所有參與者發(fā)送事務(wù) rollback 通知; 所有參與者在收到通知之后執(zhí)行 rollback 操作,并釋放占有的資源; 參與者向協(xié)調(diào)者反饋事務(wù)回滾結(jié)果。
在本階段如果因?yàn)閰f(xié)調(diào)者或網(wǎng)絡(luò)問題,導(dǎo)致參與者遲遲不能收到來自協(xié)調(diào)者的 commit 或 rollback 請(qǐng)求,那么參與者將不會(huì)如兩階段提交中那樣陷入阻塞,而是等待超時(shí)后繼續(xù) commit,相對(duì)于兩階段提交雖然降低了同步阻塞,但仍然無法完全避免數(shù)據(jù)的不一致。兩階段提交協(xié)議中所存在的長時(shí)間阻塞狀態(tài)發(fā)生的幾率還是非常低的,所以雖然三階段提交協(xié)議相對(duì)于兩階段提交協(xié)議對(duì)于數(shù)據(jù)強(qiáng)一致性更有保障,但是因?yàn)樾蕟栴},兩階段提交協(xié)議在實(shí)際系統(tǒng)中反而更加受寵。
TCC模式
Try:負(fù)責(zé)預(yù)留資源(比如新建一條狀態(tài)=PENDING的訂單);
做業(yè)務(wù)檢查,簡單來說就是不能預(yù)留已經(jīng)被占用的資源;
隔離預(yù)留資源。
Confirm:負(fù)責(zé)落地所預(yù)留的資源
真正的執(zhí)行業(yè)務(wù)使用try階段預(yù)留的資源,冪等。
TCC增加了業(yè)務(wù)檢查和撤銷事務(wù)的功能。同時(shí),TCC將2PC數(shù)據(jù)庫層面的動(dòng)作提升到了服務(wù)層面,不同的是TCC的所有動(dòng)作都是一個(gè)本地事務(wù),每個(gè)本地事務(wù)都在動(dòng)作完成后commit到數(shù)據(jù)庫:
Try相當(dāng)于2PC的Commit request phase,外加了業(yè)務(wù)檢查邏輯 Confirm相當(dāng)于2PC的Commit phase的commit動(dòng)作 Cancel相當(dāng)于2PC的Commit phase的rollback動(dòng)作
流程步驟:
發(fā)起方?發(fā)送Try到所有?參與方 每個(gè)?參與方?執(zhí)行Try,預(yù)留資源 發(fā)起方?收到所有?參與方?的Try結(jié)果 發(fā)起方?發(fā)送Confirm/Cancel到所有?參與方 每個(gè)?參與方?執(zhí)行Confirm/Cancel 發(fā)起方?收到所有?參與方?的Confirm/Cancel結(jié)果
流程和兩階段提交非常類似。
全棧架構(gòu)社區(qū)交流群
?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進(jìn)行加群。歡迎有想法、樂于分享的朋友們一起交流學(xué)習(xí)。
看完本文有收獲?請(qǐng)轉(zhuǎn)發(fā)分享給更多人
往期資源:

