深入剖析分布式事務(wù)一致性
作者:葉東富
來源:SegmentFault 思否社區(qū)
概述
分布式事務(wù)是用來解決跨數(shù)據(jù)庫、跨服務(wù)更新數(shù)據(jù)一致性問題的。那么這里的一致性指的是什么,什么是強(qiáng)一致性,什么是弱一致性,與CAP理論中的一致性概念是一樣的嗎?本文將為您深入解答相關(guān)的問題。
一致性指什么
在數(shù)據(jù)庫的理論中,事務(wù)具備大家都熟悉的ACID特性,分別如下:
Atomicity(原子性):一個(gè)事務(wù)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會(huì)被恢復(fù)到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從來沒有執(zhí)行過一樣。
Consistency(一致性):在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。完整性包括外鍵約束、應(yīng)用定義的等約束不會(huì)被破壞。
Isolation(隔離性):數(shù)據(jù)庫允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。
Durability(持久性):事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。
無法做到強(qiáng)一致

理論上的強(qiáng)一致性


對(duì)于查詢,也采用XA事務(wù),并且查詢數(shù)據(jù)時(shí),采用select for update的方式,所有數(shù)據(jù)查完之后,再xa commit
為了避免死鎖,需要將涉及到的數(shù)據(jù)庫排序,訪問數(shù)據(jù)都必須要按照相同的數(shù)據(jù)庫順序來寫入和查詢

在T0時(shí)間查詢,那么修改一定發(fā)生在查詢?nèi)客瓿芍螅圆樵兊玫浇Y(jié)果A+B
在T1,T2,T3查詢,那么查詢結(jié)果返回一定全部發(fā)生在修改完成之后,所以查詢得到結(jié)果也是A+B
NewSQL的強(qiáng)一致性
實(shí)現(xiàn)跨服務(wù)但不跨庫的分布式事務(wù)一致性,會(huì)相對(duì)簡(jiǎn)單一些,其中一種方式就是實(shí)現(xiàn)XA事務(wù)中的TMRESUME選項(xiàng)(因?yàn)樽罱K只有一個(gè)xa commit,不會(huì)出現(xiàn)兩個(gè)xa commit中間的不一致時(shí)間窗口)。 實(shí)現(xiàn)跨數(shù)據(jù)庫的分布式事務(wù)一致性,會(huì)困難很多,因?yàn)楦鱾€(gè)數(shù)據(jù)庫的內(nèi)部版本機(jī)制都不一樣,想要協(xié)同非常困難。
弱一致性的分類

無中間態(tài):數(shù)據(jù)只有兩個(gè)狀態(tài),事務(wù)前和事務(wù)后,沒有其他第三種狀態(tài)。XA、消息這兩種都是這種
有中間態(tài):數(shù)據(jù)有中間態(tài),例如TCC的Try,數(shù)據(jù)狀態(tài)和事務(wù)前事務(wù)后都不一樣;SAGA也有中間態(tài),假如一個(gè)SAGA事務(wù)執(zhí)行正向操作后數(shù)據(jù)為W,又回滾了,那么W也與事務(wù)前事務(wù)后的狀態(tài)不同。
XA:XA雖然不是強(qiáng)一致,但是XA的一致性是多種分布式事務(wù)中,一致性最好的,因?yàn)樗幱诓灰恢碌臓顟B(tài)時(shí)間很短,只有一部分分支開始commit,但還沒有全部commit的這個(gè)時(shí)間窗口,數(shù)據(jù)是不一致的。因?yàn)閿?shù)據(jù)庫的commit操作耗時(shí),通常是10ms內(nèi),因此不一致的窗口期很短。
消息:消息型在第一個(gè)操作完成后,在所有操作完成之前,這個(gè)時(shí)間窗口是不一致的,持續(xù)時(shí)長一般比XA更久。
TCC:TCC的中間態(tài),通常可控,可以自定義。通常情況下,這部分?jǐn)?shù)據(jù)不展示給用戶,因此一致性比后面的SAGA要好。
SAGA:SAGA如果發(fā)生回滾,而子事務(wù)中正向操作修改的數(shù)據(jù)會(huì)被用戶看到,可能給用戶帶來較差的體驗(yàn),因此一致性是最差的。
CAP理論中的一致性
CAP中的強(qiáng)一致性是指用戶在分布式系統(tǒng)中寫完之后,立刻去讀,如果能夠像本地讀寫那樣,讀到最新版本,那么是強(qiáng)一致性。
分布式事務(wù)中的強(qiáng)一致性,是指事務(wù)進(jìn)行的過程中,用戶讀取的數(shù)據(jù)始終滿足業(yè)務(wù)約束,目前在實(shí)際應(yīng)用中的方案,都無法做到強(qiáng)一致。
總結(jié)
我們的公號(hào):分布式事務(wù)
我們的項(xiàng)目:https://github.com/yedf/dtm
歡迎使用dtm,或者通過dtm學(xué)習(xí)實(shí)踐分布式事務(wù)相關(guān)知識(shí),歡迎star支持我們

