深入剖析分布式事務(wù)一致性
點擊下方“IT牧場”,選擇“設(shè)為星標”

概述
一致性指什么
Atomicity(原子性):一個事務(wù)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被恢復(fù)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。 Consistency(一致性):在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。完整性包括外鍵約束、應(yīng)用定義的等約束不會被破壞。 Isolation(隔離性):數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。 Durability(持久性):事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。
無法做到強一致
目前在跨庫、跨服務(wù)的分布式實際應(yīng)用中,尚未看到有強一致性的方案。
我們來看看一致性級別最高的XA事務(wù),是否是強一致的,我們以跨行轉(zhuǎn)賬(在這里,我們以跨庫更新AB來模擬)作為例子來說明,下面是一個XA事務(wù)的時序圖:
在這個時序圖中,我們在如圖所示的時間點發(fā)起查詢,那么我們查到的數(shù)據(jù),將是A+B+30,不等于A+B,不符合強一致的要求。
理論上的強一致性

這種情況下,查到結(jié)果等于A+B,但是又有另一些場景出現(xiàn)了問題,如下圖所示:
對于查詢,也采用XA事務(wù),并且查詢數(shù)據(jù)時,采用select for update的方式,所有數(shù)據(jù)查完之后,再xa commit 為了避免死鎖,需要將涉及到的數(shù)據(jù)庫排序,訪問數(shù)據(jù)都必須要按照相同的數(shù)據(jù)庫順序來寫入和查詢

在T0時間查詢,那么修改一定發(fā)生在查詢?nèi)客瓿芍螅圆樵兊玫浇Y(jié)果A+B
在T1,T2,T3查詢,那么查詢結(jié)果返回一定全部發(fā)生在修改完成之后,所以查詢得到結(jié)果也是A+B
很明顯這種理論上的強一致,效率極低,所有有數(shù)據(jù)交集的數(shù)據(jù)庫事務(wù)都是串行執(zhí)行,而且還需要按照特定的順序查詢/修改數(shù)據(jù),因此成本極高,幾乎無法應(yīng)用在生產(chǎn)中。
NewSQL的強一致性
實現(xiàn)跨服務(wù)但不跨庫的分布式事務(wù)一致性,會相對簡單一些,其中一種方式就是實現(xiàn)XA事務(wù)中的TMRESUME選項(因為最終只有一個xa commit,不會出現(xiàn)兩個xa commit中間的不一致時間窗口)。 實現(xiàn)跨數(shù)據(jù)庫的分布式事務(wù)一致性,會困難很多,因為各個數(shù)據(jù)庫的內(nèi)部版本機制都不一樣,想要協(xié)同非常困難。
弱一致性的分類

無中間態(tài):數(shù)據(jù)只有兩個狀態(tài),事務(wù)前和事務(wù)后,沒有其他第三種狀態(tài)。XA、消息這兩種都是這種
有中間態(tài):數(shù)據(jù)有中間態(tài),例如TCC的Try,數(shù)據(jù)狀態(tài)和事務(wù)前事務(wù)后都不一樣;SAGA也有中間態(tài),假如一個SAGA事務(wù)執(zhí)行正向操作后數(shù)據(jù)為W,又回滾了,那么W也與事務(wù)前事務(wù)后的狀態(tài)不同。
XA:XA雖然不是強一致,但是XA的一致性是多種分布式事務(wù)中,一致性最好的,因為他處于不一致的狀態(tài)時間很短,只有一部分分支開始commit,但還沒有全部commit的這個時間窗口,數(shù)據(jù)是不一致的。因為數(shù)據(jù)庫的commit操作耗時,通常是10ms內(nèi),因此不一致的窗口期很短。
消息:消息型在第一個操作完成后,在所有操作完成之前,這個時間窗口是不一致的,持續(xù)時長一般比XA更久。
TCC:TCC的中間態(tài),通常可控,可以自定義。通常情況下,這部分數(shù)據(jù)不展示給用戶,因此一致性比后面的SAGA要好。
SAGA:SAGA如果發(fā)生回滾,而子事務(wù)中正向操作修改的數(shù)據(jù)會被用戶看到,可能給用戶帶來較差的體驗,因此一致性是最差的。
CAP理論中的一致性
CAP中的強一致性是指用戶在分布式系統(tǒng)中寫完之后,立刻去讀,如果能夠像本地讀寫那樣,讀到最新版本,那么是強一致性。 分布式事務(wù)中的強一致性,是指事務(wù)進行的過程中,用戶讀取的數(shù)據(jù)始終滿足業(yè)務(wù)約束,目前在實際應(yīng)用中的方案,都無法做到強一致。
總結(jié)
作者:葉東富
來源:segmentfault.com/a/1190000041106277
版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),僅供分享學(xué)習(xí),版權(quán)歸原創(chuàng)者所有。除非無法確認,我們都會標明作者及出處,如有侵權(quán)煩請告知,我們會立即刪除并表示歉意。謝謝!
干貨分享
最近將個人學(xué)習(xí)筆記整理成冊,使用PDF分享。關(guān)注我,回復(fù)如下代碼,即可獲得百度盤地址,無套路領(lǐng)取!
?001:《Java并發(fā)與高并發(fā)解決方案》學(xué)習(xí)筆記;?002:《深入JVM內(nèi)核——原理、診斷與優(yōu)化》學(xué)習(xí)筆記;?003:《Java面試寶典》?004:《Docker開源書》?005:《Kubernetes開源書》?006:《DDD速成(領(lǐng)域驅(qū)動設(shè)計速成)》?007:全部?008:加技術(shù)群討論
加個關(guān)注不迷路
喜歡就點個"在看"唄^_^
