事務(wù)ACID谤职、隔離級(jí)別及CAP、BASE理論

相信不少讀者容易搞混事務(wù)的ACID屬性亿鲜、事務(wù)隔離級(jí)別允蜈、CAP理論以及BASE理論都是什么,它們之間有什么關(guān)系蒿柳,本文將對(duì)這些看起來(lái)有一定關(guān)聯(lián)的概念做一個(gè)探討饶套。

事務(wù)的ACID屬性

談到數(shù)據(jù)庫(kù)事務(wù),ACID屬性總是無(wú)法繞過(guò)垒探,先了解下什么是ACID妓蛮,再跟后面內(nèi)容做一個(gè)對(duì)比,加深理解圾叼。
事務(wù)本質(zhì)上是由一組關(guān)聯(lián)SQL組成的執(zhí)行任務(wù)單元蛤克,事務(wù)必須符合4個(gè)基本屬性才能稱之為一個(gè)有效的事務(wù):

  • A: Atomic, 原子性,一組執(zhí)行任務(wù)單元要么一起成功夷蚊,要么一起失敗撤銷构挤,不能存在部分成功的情況。
  • C: Consistency惕鼓,一致性筋现,事務(wù)執(zhí)行結(jié)束后,邏輯上數(shù)據(jù)的完整性是不變的呜笑。
  • I : Isolation, 隔離性夫否,事務(wù)之間彼此獨(dú)立,不會(huì)相互影響叫胁,不允許事務(wù)A讀取到事務(wù)B的中間狀態(tài)的情況凰慈。
  • D: Durability,持久性驼鹅,事務(wù)執(zhí)行完成后微谓,數(shù)據(jù)就能持久存儲(chǔ),即便系統(tǒng)崩潰输钩,數(shù)據(jù)也能正巢蛐停恢復(fù)。
    ACID的關(guān)注點(diǎn)主要集中在一次事務(wù)的基本能力訴求上买乃,而怎么達(dá)到事務(wù)的這些屬性要求姻氨,需要交由各個(gè)系統(tǒng)去考慮及實(shí)現(xiàn)。

事務(wù)的隔離級(jí)別

事務(wù)有4種隔離級(jí)別剪验,從隔離程度的低到高分別是:

  • Read uncommitted:讀未提交
    一個(gè)事務(wù)尚未提交肴焊,其他事務(wù)就可以讀到它的中間狀態(tài)數(shù)據(jù)前联。
    讀未提交的實(shí)現(xiàn)方式是,在事務(wù)過(guò)程中不做任何控制娶眷,一遍執(zhí)行事務(wù)一遍實(shí)時(shí)生效到數(shù)據(jù)庫(kù)中似嗤。
    這個(gè)過(guò)程中如果其他事務(wù)在讀寫同一個(gè)數(shù)據(jù),那么最終結(jié)果是會(huì)發(fā)生錯(cuò)誤的届宠,也就是說(shuō)存在“臟讀”的可能性烁落。

  • Read committed:讀已提交
    事務(wù)只有在提交以后,其他事務(wù)才能讀到它的更新數(shù)據(jù)豌注。
    讀已提交的實(shí)現(xiàn)方式是伤塌,同樣不做事務(wù)過(guò)程控制,只關(guān)注單個(gè)事務(wù)執(zhí)行過(guò)程的中間數(shù)據(jù)不直接入庫(kù)幌羞,而是在執(zhí)行完畢后一次性把緩存副本全部刷到數(shù)據(jù)庫(kù)中寸谜。
    上述實(shí)現(xiàn)避免中間態(tài)外泄的問(wèn)題,避免了“臟讀”属桦,但無(wú)法避免一個(gè)事務(wù)在兩次讀取A數(shù)據(jù)的過(guò)程中數(shù)據(jù)被其他事務(wù)更新熊痴,導(dǎo)致兩次讀出來(lái)數(shù)據(jù)不一致的問(wèn)題,也就是“不可重復(fù)讀”聂宾。


    不可重復(fù)讀
  • Repeatable read:可重復(fù)讀
    對(duì)事務(wù)過(guò)程的并發(fā)進(jìn)行控制果善,事務(wù)啟動(dòng)后會(huì)鎖著相關(guān)的數(shù)據(jù),禁止其他事務(wù)進(jìn)行讀寫系谐。
    這樣又避免了“不可重復(fù)讀”的問(wèn)題巾陕,然而,如果事務(wù)過(guò)程包含count操作纪他,在兩次count之間鄙煤,有一個(gè)插入數(shù)據(jù)的事務(wù)執(zhí)行了,那么兩次count的內(nèi)容又會(huì)不一致茶袒,這就是“幻讀”梯刚。

  • Serializable:序列化
    所有事務(wù)進(jìn)入執(zhí)行隊(duì)列串行執(zhí)行,把并發(fā)事務(wù)disable掉薪寓,除了性能問(wèn)題亡资,序列化方案能避免所有問(wèn)題。

CAP理論

不同類型的分布式存儲(chǔ)系統(tǒng)向叉,對(duì)于數(shù)據(jù)可靠的要求程度是不同的锥腻,也就是說(shuō),不同人對(duì)于怎樣的一個(gè)系統(tǒng)算是可靠的定義是不一樣的母谎。那么通過(guò)怎樣的標(biāo)準(zhǔn)來(lái)衡量系統(tǒng)的可靠程度呢瘦黑?
Eric Brewer提出了分布式系統(tǒng)的三個(gè)衡量系統(tǒng)可靠性的指標(biāo),來(lái)論證分布式系統(tǒng)的可靠能力邊界,它們統(tǒng)稱CAP理論:


CAP
  • Consitency: 一致性
    分布式系統(tǒng)各節(jié)點(diǎn)之間的數(shù)據(jù)幸斥,是否能保證嚴(yán)格一致存崖,即每次的數(shù)據(jù)變更,要么同時(shí)在全部節(jié)點(diǎn)生效睡毒,要么全部不生效,不會(huì)出現(xiàn)只有部分節(jié)點(diǎn)生效的情況冗栗,即強(qiáng)一致性演顾。
    舉例:
    把分布式系統(tǒng)的數(shù)據(jù)A改成B,當(dāng)系統(tǒng)返回成功的時(shí)刻起隅居,任何查詢?cè)摂?shù)據(jù)的請(qǐng)求都能正確得到B钠至,期間不存在部分查詢得到A,部分得到B的中間狀態(tài)胎源。
    再稍微擴(kuò)展下棉钧,對(duì)于一致性的等級(jí),可以進(jìn)一步分成三種:
1涕蚤、強(qiáng)一致性
指更新操作完成的時(shí)刻宪卿,對(duì)所有節(jié)點(diǎn)的讀操作都返回更新后的內(nèi)容(基于同一個(gè)數(shù)據(jù)副本)。
2万栅、弱一致性
指更新以后佑钾,允許部分或全部讀取的結(jié)果不能返回更新后的內(nèi)容。
3烦粒、最終一致性
指更新完成一段時(shí)間以后休溶,系統(tǒng)最終達(dá)成數(shù)據(jù)的一致性。
  • Availability: 可用性
    可用性指的是每一個(gè)向服務(wù)器發(fā)起的請(qǐng)求扰她,都能在可容忍的一定時(shí)間內(nèi)得到符合業(yè)務(wù)預(yù)期的響應(yīng)結(jié)果兽掰。
  • Partition tolerance: 分區(qū)容忍性
    分區(qū)容忍性指的是系統(tǒng)存在多個(gè)節(jié)點(diǎn)的情況下,不會(huì)因?yàn)槟巢糠止?jié)點(diǎn)故障導(dǎo)致服務(wù)完全不可用徒役。
    存在分布式存儲(chǔ)系統(tǒng)的原因孽尽,除了高可用高性能的需求外,最基礎(chǔ)的就是數(shù)據(jù)有備份機(jī)制廉涕,不能存在由于某個(gè)節(jié)點(diǎn)的問(wèn)題導(dǎo)致全部數(shù)據(jù)丟失泻云。基于這個(gè)原因狐蜕,數(shù)據(jù)存儲(chǔ)系統(tǒng)分區(qū)是必須的宠纯。
    但是分區(qū)又會(huì)帶入另一個(gè)問(wèn)題,就是分區(qū)系統(tǒng)間的網(wǎng)絡(luò)可能會(huì)抖動(dòng)层释、某些服務(wù)器可能會(huì)崩潰婆瓜,也就是說(shuō)分區(qū)出現(xiàn)數(shù)據(jù)狀態(tài)不一致等的情況幾乎是必然發(fā)生的,分布式存儲(chǔ)服務(wù)的設(shè)計(jì)必須容忍這種情況,并以某種方式讓數(shù)據(jù)最終能夠達(dá)成一致廉白。如果不允許此情況發(fā)生个初,唯一的解決方案就是沒(méi)有分區(qū),也就是單節(jié)點(diǎn)運(yùn)行猴蹂,而這又是服務(wù)器設(shè)計(jì)的兵家大忌院溺。

選擇AP還是CP的現(xiàn)實(shí)問(wèn)題

在理解了CAP理論的定義之后,我們知道了分區(qū)容忍性是必須滿足的磅轻,那么讓我們探討下CAP能否同時(shí)保障珍逸。
假設(shè)我們有一個(gè)由2臺(tái)服務(wù)器組成的分布式數(shù)據(jù)庫(kù)系統(tǒng),現(xiàn)在服務(wù)器之間的網(wǎng)絡(luò)斷開(kāi)了聋溜,然后存儲(chǔ)系統(tǒng)收到了一個(gè)更新操作谆膳,把數(shù)據(jù)A更新為B。

  • 如果我們必須保證強(qiáng)一致性(C)撮躁。

1)我們可以讓一臺(tái)服務(wù)器接管所有更新跟后續(xù)的查詢請(qǐng)求漱病,也就是說(shuō)我們必須放棄另一臺(tái)機(jī)器,單機(jī)運(yùn)行把曼,即放棄分區(qū)容忍性杨帽,保障系統(tǒng)的強(qiáng)一致性以及可用性(CA)。
2)我們也可以選擇更新失敗嗤军,等待兩臺(tái)服務(wù)器之間的網(wǎng)絡(luò)連接恢復(fù)睦尽,然后再通知用戶重新發(fā)起請(qǐng)求,放棄可用性(CP)型雳。

  • 如果我們必須保證可用性(A)当凡。

這意味著更新操作必須得到成功的響應(yīng)結(jié)果。
3)我們可以選擇兩臺(tái)服務(wù)器一起工作纠俭,每臺(tái)完成自己的獨(dú)立讀寫沿量,實(shí)現(xiàn)分區(qū)容忍性,等網(wǎng)絡(luò)恢復(fù)了再手工進(jìn)行服務(wù)器之間的數(shù)據(jù)同步冤荆,放棄強(qiáng)一致性(AP)朴则。
4)我們也可以選擇只讓一臺(tái)服務(wù)器工作,回到方案1钓简,放棄分區(qū)容忍性(AC)乌妒。

  • 如果我們必須保證分區(qū)容忍性(P)。

也就是說(shuō)我們要讓兩臺(tái)服務(wù)器能夠同時(shí)處理請(qǐng)求外邓。
我們可以選擇回到假設(shè)2的方案1撤蚊,放棄強(qiáng)一致性(PC)。
或者可以選擇回到假設(shè)3的方案2损话,放棄可用性(PA)侦啸。

基于上述的假設(shè)槽唾,我們能夠清楚地知道,CAP中的三者不可兼得光涂,我們往往只能選擇兩個(gè)庞萍。

  • 1、保障CA忘闻,舍棄P:
    舍棄分區(qū)容忍性钝计,意味著我們只能讓一臺(tái)服務(wù)器接管所有的請(qǐng)求,放棄高可用齐佳。那么就有一個(gè)單點(diǎn)故障的問(wèn)題存在葵蒂,一旦單機(jī)掛了,那么整個(gè)系統(tǒng)就不可用了重虑。
    因此,舍棄分區(qū)容忍性基本是不可接受的秦士。
    大多數(shù)的關(guān)系型數(shù)據(jù)庫(kù)默認(rèn)都是CA模型缺厉,并不考慮分區(qū)容忍性,有時(shí)候我們會(huì)簡(jiǎn)單地采用master-slave的方式來(lái)做數(shù)據(jù)冷備隧土,這種方式實(shí)際上也是CA提针,因?yàn)閙aster掛了服務(wù)就不可用了。

  • 2曹傀、保障AP辐脖,舍棄C:
    舍棄強(qiáng)一致性,意味著當(dāng)故障發(fā)生皆愉,有些用戶進(jìn)行寫操作以后嗜价,可能出現(xiàn)某些請(qǐng)求出現(xiàn)結(jié)果,某些請(qǐng)求又返回修改前的數(shù)據(jù)的情況幕庐,只要保障最終一致性就可以久锥。
    在大多數(shù)對(duì)數(shù)據(jù)一致性不具有很強(qiáng)要求的應(yīng)用場(chǎng)景,可以采用這種方式异剥,比如各類緩存服務(wù)模塊瑟由,目標(biāo)是服務(wù)穩(wěn)定,至于數(shù)據(jù)是否完全一致冤寿,并不那么重要歹苦。
    再接著第一點(diǎn)的master-slave方案中,有讀者又會(huì)提出問(wèn)題督怜,如果master-slave是一主多從殴瘦,主寫從讀呢?-- 這種就沒(méi)法保證一致性了号杠,實(shí)際上是AP模式痴施。

  • 3、保障CP,舍棄A:
    放棄可用性辣吃,意味著當(dāng)故障發(fā)生的時(shí)候动遭,我們要讓整個(gè)系統(tǒng)處于不可用的狀態(tài),直到故障恢復(fù)神得,系統(tǒng)才能繼續(xù)響應(yīng)用戶的請(qǐng)求厘惦。
    這樣的設(shè)計(jì)在應(yīng)用系統(tǒng)中大多在跟錢打交道的應(yīng)用中使用,當(dāng)故障發(fā)生的時(shí)候哩簿,我們讓寫的請(qǐng)求操作不可用宵蕉,只讀不寫,放棄寫的可用性节榜。
    在關(guān)系型數(shù)據(jù)庫(kù)的分布式事務(wù)羡玛,或者像上文的master-slave的架構(gòu)升級(jí)版,主寫從讀宗苍,二階段提交稼稿,從掛了就舍棄,主掛了就重新選舉呢讳窟?
    實(shí)際上這就是Zookeeper這種數(shù)據(jù)治理系統(tǒng)常用的解決方案让歼,保障了CP,但當(dāng)系統(tǒng)分裂程度達(dá)到分區(qū)的容忍范圍外的情況下(一般是1/2及以上丽啡,避免腦裂發(fā)生)谋右,系統(tǒng)會(huì)不可用,從而放棄可用性补箍。

BASE理論

BASE理論改执,即Basically Available, Soft state, Eventually consistency(基本可用,軟(過(guò)渡)狀態(tài)坑雅,并達(dá)到最終一致)天梧。
BASE理論是在CAP理論的三種剛性要求基礎(chǔ)上提出的折中方案,中心思想是根據(jù)業(yè)務(wù)場(chǎng)景霞丧,在可容忍范圍內(nèi)呢岗,盡可能保障用戶體驗(yàn)及服務(wù)可用。

  • Basically Available:基本可用
    系統(tǒng)即便在發(fā)生部分故障的情況下蛹尝,也能保持基本可用的狀態(tài)后豫。
  • Soft state:軟(過(guò)渡)狀態(tài)
    軟狀態(tài)指的是,允許存在中間存在數(shù)據(jù)不一致的情況突那,參考關(guān)于上文Consistency一節(jié)提到的三種一致性等級(jí)挫酿。
  • Eventually consistency:達(dá)到最終一致
    能通過(guò)自動(dòng)、手動(dòng)同步等方式愕难,讓數(shù)據(jù)達(dá)到最終一致性早龟。

總結(jié)

最后惫霸,我們來(lái)把事務(wù)ACID/隔離級(jí)別,CAP及BASE理論串一下葱弟。

  • 一個(gè)生產(chǎn)可用的存儲(chǔ)系統(tǒng)要求至少得是一個(gè)分布式系統(tǒng)壹店,而通過(guò)CAP理論,我們得知分布式存儲(chǔ)系統(tǒng)不是萬(wàn)能的芝加,它具備能力邊界硅卢。
  • CAP理論要求的三種指標(biāo)都太剛性,我們可以使用BASE理論來(lái)設(shè)計(jì)一個(gè)存在中間過(guò)渡狀態(tài)的實(shí)現(xiàn)方案藏杖。
  • 如果存儲(chǔ)系統(tǒng)需要滿足事務(wù)需求将塑,需要達(dá)到ACID的4種屬性要求。
  • 在具體實(shí)現(xiàn)事務(wù)的設(shè)計(jì)方案中蝌麸,存在4種相互隔離的級(jí)別可供選擇点寥,業(yè)務(wù)需根據(jù)自己的使用場(chǎng)景進(jìn)行選擇。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末来吩,一起剝皮案震驚了整個(gè)濱河市敢辩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌误褪,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碾褂,死亡現(xiàn)場(chǎng)離奇詭異兽间,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)正塌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門嘀略,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人乓诽,你說(shuō)我怎么就攤上這事帜羊。” “怎么了鸠天?”我有些...
    開(kāi)封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵讼育,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我稠集,道長(zhǎng)奶段,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任剥纷,我火速辦了婚禮痹籍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晦鞋。我一直安慰自己蹲缠,他們只是感情好棺克,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著线定,像睡著了一般娜谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渔肩,一...
    開(kāi)封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天因俐,我揣著相機(jī)與錄音,去河邊找鬼周偎。 笑死抹剩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蓉坎。 我是一名探鬼主播澳眷,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛉艾!你這毒婦竟也來(lái)了钳踊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤勿侯,失蹤者是張志新(化名)和其女友劉穎拓瞪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體助琐,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祭埂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兵钮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛆橡。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掘譬,靈堂內(nèi)的尸體忽然破棺而出泰演,到底是詐尸還是另有隱情,我是刑警寧澤葱轩,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布睦焕,位于F島的核電站,受9級(jí)特大地震影響靴拱,放射性物質(zhì)發(fā)生泄漏复亏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一缭嫡、第九天 我趴在偏房一處隱蔽的房頂上張望缔御。 院中可真熱鬧,春花似錦妇蛀、人聲如沸耕突。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眷茁。三九已至炕泳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間上祈,已是汗流浹背培遵。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留登刺,地道東北人籽腕。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纸俭,于是被迫代替她去往敵國(guó)和親皇耗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容