DDIA 6. 事務(wù)

目錄

  1. 理解ACID
  2. 讀已提交(行鎖,handle 臟讀,臟寫(xiě)求摇,更新丟失)
  3. 不可重復(fù)讀 (快照隔離, handle 讀偏差)
  4. 可序列化 (2階段鎖定浸间,間隙鎖,可序列化快照隔離吟榴, 解決 寫(xiě)偏差魁蒜,幻讀)

事務(wù),作為一個(gè)簡(jiǎn)化訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序的編程模型。通過(guò)使用事務(wù)兜看,應(yīng)用程序可以忽略某些潛在的錯(cuò)誤場(chǎng)景和并發(fā)問(wèn)題锥咸,由數(shù)據(jù)庫(kù)負(fù)責(zé)處理它們。

ACID

  • 原子性(Atomicity)
    一般來(lái)說(shuō)细移,原子指的是不能分解成更小的部分的東西搏予。如果寫(xiě)操作被組合到一個(gè)原子事務(wù)中,并且由于一個(gè)錯(cuò)誤弧轧,事務(wù)不能完成缔刹,那么事務(wù)將被中止,數(shù)據(jù)庫(kù)必須丟棄或撤消它在該事務(wù)中所做的任何寫(xiě)入操作劣针。原子性簡(jiǎn)化了數(shù)據(jù)庫(kù)的數(shù)據(jù)模型:如果一個(gè)事務(wù)被中止時(shí),應(yīng)用程序可以確保它沒(méi)有任何改變亿扁,因此可以被重試捺典。

  • 一致性(Consistency)
    一致性的表述是:數(shù)據(jù)庫(kù)之中的數(shù)據(jù)必須始終正確。例如从祝,在一個(gè)會(huì)計(jì)系統(tǒng)襟己,所有賬戶的收支必須平衡。應(yīng)用程序有責(zé)任正確定義其事務(wù)牍陌,從而保持一致性擎浴。這不是數(shù)據(jù)庫(kù)能保證的:如果你寫(xiě)了違反你的不變量的壞數(shù)據(jù),數(shù)據(jù)庫(kù)不能阻止你毒涧。應(yīng)用程序可能會(huì)依賴于數(shù)據(jù)庫(kù)的原子性和隔離性以達(dá)到一致性贮预。

  • 隔離性(Isolation):
    數(shù)據(jù)庫(kù)由多個(gè)客戶端同時(shí)訪問(wèn)時(shí),如果他們?cè)L問(wèn)相同的數(shù)據(jù)庫(kù)記錄契讲,你會(huì)遇到并發(fā)問(wèn)題仿吞。如下圖所示:

    并發(fā)寫(xiě)對(duì)隔離性的破壞

    隔離性意味著并發(fā)執(zhí)行的事務(wù)彼此隔離,數(shù)據(jù)庫(kù)確保當(dāng)事務(wù)提交時(shí)捡偏,結(jié)果與它們順序運(yùn)行相同唤冈,即使它們實(shí)際上是并發(fā)運(yùn)行的。

  • 持久性(Durability):
    持久性是一個(gè)承諾银伟,一旦事務(wù)成功提交你虹,它所寫(xiě)的任何數(shù)據(jù)將不會(huì)丟失,即使有硬件故障或數(shù)據(jù)庫(kù)崩潰彤避。在單節(jié)點(diǎn)數(shù)據(jù)庫(kù)中傅物,持久性通常意味著數(shù)據(jù)已寫(xiě)入非易失性存儲(chǔ)(如硬盤(pán)驅(qū)動(dòng)器或SSD)。它通常還需要寫(xiě)入日志忠藤,以便出現(xiàn)文件損壞時(shí)恢復(fù)工作挟伙。在分布式數(shù)據(jù)庫(kù)中,持久性可能意味著數(shù)據(jù)已成功復(fù)制到一些節(jié)點(diǎn)上。

ACD這三個(gè)特性可以參考我的分布式文集里的第六章 錯(cuò)誤恢復(fù)和日志

在幾種特性之中尖阔,隔離性是DBA對(duì)數(shù)據(jù)庫(kù)調(diào)優(yōu)最為側(cè)重的部分贮缅,接下來(lái),我們著重來(lái)聊一聊事務(wù)的隔離性介却。(同第七章 并發(fā)控制

隔離級(jí)別

并發(fā)錯(cuò)誤很難通過(guò)測(cè)試發(fā)現(xiàn)谴供,因?yàn)檫@種的錯(cuò)誤觸發(fā)具有偶然性,通常很難重現(xiàn)齿坷。并發(fā)性也很難推理桂肌,尤其是在大型應(yīng)用程序中,因?yàn)殚_(kāi)發(fā)人員不一定知道其他代碼片段正在訪問(wèn)數(shù)據(jù)庫(kù)永淌。所以數(shù)據(jù)庫(kù)通過(guò)提供事務(wù)的隔離性來(lái)隱藏應(yīng)用程序開(kāi)發(fā)者的并發(fā)問(wèn)題崎场,屏蔽了底層數(shù)據(jù)庫(kù)的并發(fā)細(xì)節(jié),提供了一個(gè)串行化的數(shù)據(jù)模型遂蛀。

天下沒(méi)有免費(fèi)的午餐谭跨,串行化的隔離級(jí)別會(huì)帶來(lái)額外的性能開(kāi)銷(xiāo),所以許多數(shù)據(jù)庫(kù)會(huì)提供一些弱隔離級(jí)別作為選擇李滴,它們可以防止一部分并發(fā)問(wèn)題螃宙。所以,接下來(lái)所坯,我們將一一梳理谆扎,不同的隔離級(jí)別之間的差異。

讀已提交(read commited)

  • 當(dāng)從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)時(shí)芹助,只看到已提交的數(shù)據(jù)(沒(méi)有臟讀)堂湖。

  • 當(dāng)寫(xiě)入數(shù)據(jù)庫(kù)時(shí),只覆蓋已提交的數(shù)據(jù)(沒(méi)有臟寫(xiě))状土。

臟讀:

一個(gè)事務(wù)已經(jīng)向數(shù)據(jù)庫(kù)寫(xiě)入了一些數(shù)據(jù)苗缩,但該事務(wù)尚未提交或中止。另一個(gè)事務(wù)可以看到未提交的數(shù)據(jù)声诸,就稱為臟讀酱讶。Read Committed的隔離級(jí)別可以防止臟讀。所以當(dāng)事務(wù)提交之后彼乌,事務(wù)中的寫(xiě)操作才對(duì)其他人可見(jiàn)泻肯。如下圖所示:

User2在User1事務(wù)提交之后才能讀到新的值

臟寫(xiě):

寫(xiě)操作覆蓋了一個(gè)未提交的值,被稱之為臟寫(xiě)慰照。Read Committed的隔離級(jí)別事務(wù)可以防止臟寫(xiě)灶挟,通常是通過(guò)延遲寫(xiě)操作直到前一個(gè)寫(xiě)事務(wù)已提交或中止時(shí)在繼續(xù)寫(xiě)入。臟寫(xiě)會(huì)導(dǎo)致數(shù)據(jù)出現(xiàn)不一致毒租,如下圖所示:Alice和Bob要買(mǎi)同一個(gè)東西稚铣,臟寫(xiě)導(dǎo)致了最終的買(mǎi)家是Bob,而發(fā)票卻寄給了Alice。

臟寫(xiě)導(dǎo)致了數(shù)據(jù)的不一致性

實(shí)現(xiàn):

Read Committed是一種十分流行的隔離級(jí)別惕医,許多數(shù)據(jù)庫(kù)的默認(rèn)隔離級(jí)別便是Read Committed耕漱。

數(shù)據(jù)庫(kù)通過(guò)使用行級(jí)鎖防止臟寫(xiě):當(dāng)事務(wù)要修改某個(gè)特定行時(shí),它必須首先獲取該行的鎖抬伺。然后必須保留該鎖螟够,直到事務(wù)提交或中止為止。只有一個(gè)事務(wù)可以鎖定任何給定行的鎖峡钓;如果另一個(gè)事務(wù)要寫(xiě)入同一個(gè)行妓笙,則必須等到第一個(gè)事務(wù)提交或中止后才可獲取鎖并繼續(xù)。

而使用行級(jí)鎖避免臟讀會(huì)產(chǎn)生很大的代價(jià)能岩。因?yàn)橐粋€(gè)長(zhǎng)時(shí)間運(yùn)行的寫(xiě)入事務(wù)會(huì)迫使許多只讀事務(wù)等到這個(gè)慢寫(xiě)入事務(wù)完成寞宫。這會(huì)損失只讀事務(wù)的響應(yīng)時(shí)間,并且不利于可操作性:因?yàn)榈却i拉鹃,應(yīng)用某個(gè)部分的遲緩可能由于連鎖效應(yīng)淆九,導(dǎo)致其他部分出現(xiàn)問(wèn)題。

對(duì)于寫(xiě)入的每個(gè)對(duì)象毛俏,數(shù)據(jù)庫(kù)都會(huì)記住舊的已提交值,和由當(dāng)前持有寫(xiě)入鎖的事務(wù)設(shè)置的新值饲窿。 當(dāng)事務(wù)正在進(jìn)行時(shí)煌寇,讀取同一行的任何其他事務(wù)都只給出舊值。只有當(dāng)新值被提交時(shí)逾雄,事務(wù)才切換到讀取新值阀溶。

不可重復(fù)讀

Read Committed看起來(lái)是一個(gè)很好的隔離級(jí)別了,但是它也會(huì)產(chǎn)生一些問(wèn)題鸦泳,我們看下面這個(gè)例子:如圖所示银锻,Alice在一家銀行有1000美元的存款,在兩個(gè)賬戶上拆分做鹰,每個(gè)賬戶有500美元』魑常現(xiàn)在,一個(gè)事務(wù)從她的帳戶轉(zhuǎn)到另一個(gè)帳戶100美元钾麸。如果她很不幸地在事務(wù)正在進(jìn)行的同一時(shí)刻查看她的賬戶余額清單更振,她可能會(huì)看到一個(gè)賬戶余額在收到的款項(xiàng)到達(dá)之前(余額為500美元),另一個(gè)賬戶在已進(jìn)行的轉(zhuǎn)移之后(新余額為400美元)饭尝,而100美元消失了肯腕。


消失的100美元

在Read Committed隔離級(jí)別之下出現(xiàn)的這種異常被稱為不可重復(fù)讀,我們需要尋找新的解決方案。

快照隔離

為了實(shí)現(xiàn)可重復(fù)讀钥平,我們需要快照隔離的技術(shù)实撒。

每個(gè)事務(wù)都從數(shù)據(jù)庫(kù)的快照中讀取的,即事務(wù)在事務(wù)開(kāi)始時(shí)看到數(shù)據(jù)庫(kù)中提交的所有數(shù)據(jù)。即使數(shù)據(jù)隨后被另一個(gè)事務(wù)更改知态,每個(gè)事務(wù)只看到來(lái)自特定時(shí)間點(diǎn)的舊數(shù)據(jù)捷兰。當(dāng)事務(wù)可以看到數(shù)據(jù)庫(kù)的數(shù)據(jù),在特定時(shí)間點(diǎn)被凍結(jié)了肴甸。

快照隔離的實(shí)現(xiàn)通常使用寫(xiě)鎖來(lái)防止臟寫(xiě)寂殉,這意味著編寫(xiě)的事務(wù)可以阻止寫(xiě)入同一對(duì)象的另一個(gè)事務(wù)的進(jìn)程。實(shí)現(xiàn)快照隔離原在,數(shù)據(jù)庫(kù)必須保留數(shù)據(jù)的幾個(gè)不同的提交版本友扰,因?yàn)楦鞣N正在進(jìn)行的事務(wù)可能需要在不同的時(shí)間點(diǎn)查看數(shù)據(jù)庫(kù)的狀態(tài),這種技術(shù)被稱為多版本并發(fā)控制(MVCC)庶柿。

如下圖所示村怪,每當(dāng)一個(gè)事務(wù)向數(shù)據(jù)庫(kù)寫(xiě)入任何內(nèi)容時(shí),它寫(xiě)入的數(shù)據(jù)都會(huì)用事務(wù)ID進(jìn)行標(biāo)記浮庐。


通過(guò)事務(wù)ID實(shí)現(xiàn)MVCC

當(dāng)事務(wù)從數(shù)據(jù)庫(kù)中讀取時(shí)甚负,事務(wù)ID用于決定哪些數(shù)據(jù)可見(jiàn),哪些數(shù)據(jù)是不可見(jiàn)的审残。在每次更改值時(shí)創(chuàng)建新版本梭域,數(shù)據(jù)庫(kù)可以提供快照隔離,而只產(chǎn)生較小的開(kāi)銷(xiāo)搅轿。

Serializability

Read Repeatable雖然解決了讀取數(shù)據(jù)的問(wèn)題病涨,但是依然沒(méi)有辦法解決并發(fā)寫(xiě)的問(wèn)題。我們來(lái)看看下面這個(gè)例子:醫(yī)院通常在任何時(shí)候都要有幾個(gè)值班醫(yī)生璧坟,必須至少有一位醫(yī)生在值班既穆。醫(yī)生可以調(diào)整他們的輪班,前提是至少有一個(gè)同事在醫(yī)院值班雀鹃。Alice和Bob是兩位今天值班的醫(yī)生幻工。兩人都想調(diào)整輪班,不幸的是黎茎,他們碰巧點(diǎn)擊按鈕大約在同一時(shí)間取消輪班囊颅。接下來(lái)發(fā)生的情況如圖所示:


并發(fā)寫(xiě),產(chǎn)生的問(wèn)題

由于數(shù)據(jù)庫(kù)的隔離級(jí)別是快照隔離傅瞻,兩個(gè)人都檢查到目前有兩個(gè)人值班迁酸,因此兩個(gè)事務(wù)都進(jìn)入下一個(gè)階段。Alice認(rèn)為請(qǐng)假?zèng)]有問(wèn)題俭正,Bob也認(rèn)為請(qǐng)假?zèng)]有問(wèn)題奸鬓。兩個(gè)事務(wù)都提交了,現(xiàn)在沒(méi)有醫(yī)生在值班了掸读,數(shù)據(jù)庫(kù)的一致性出現(xiàn)了問(wèn)題串远。

Serializability 被看作是最強(qiáng)的隔離級(jí)別宏多。數(shù)據(jù)庫(kù)保證,如果事務(wù)在單獨(dú)運(yùn)行時(shí)行為正確澡罚,則它們?cè)诓l(fā)運(yùn)行時(shí)仍然正確伸但,換句話說(shuō),數(shù)據(jù)庫(kù)防止所有可能的競(jìng)爭(zhēng)條件留搔。接下來(lái)我們將詳細(xì)來(lái)聊一聊Serializability的隔離級(jí)別是如何實(shí)現(xiàn)的更胖。

兩階段鎖(2PL)

數(shù)據(jù)庫(kù)發(fā)展幾十年來(lái),廣泛使用的算法:兩階段鎖(2PL)隔显。

  • 事務(wù)A獲取了數(shù)據(jù)的讀鎖却妨,而事務(wù)B想寫(xiě)對(duì)應(yīng)的數(shù)據(jù),則必須事務(wù)A提交或中止后方可繼續(xù)寫(xiě)入操作括眠。這可以確保事務(wù)B不會(huì)意外地改變事務(wù)A正在讀取的數(shù)據(jù)彪标。

  • 事務(wù)A獲取了數(shù)據(jù)的寫(xiě)鎖,事務(wù)B想讀取對(duì)應(yīng)的數(shù)據(jù)掷豺,事務(wù)B也必須等到事務(wù)A提交或中止后方可進(jìn)行讀取捞烟。

  • 事務(wù)A獲取了數(shù)據(jù)的寫(xiě)鎖,事務(wù)B想寫(xiě)對(duì)應(yīng)的數(shù)據(jù)当船,事務(wù)B也必須等到事務(wù)A提交或中止后方可進(jìn)行寫(xiě)入操作题画。

由上面三個(gè)規(guī)則可以看出,2PL提供串行化的訪問(wèn)德频,它可以防止任何的并發(fā)問(wèn)題苍息,但是由此帶來(lái)的問(wèn)題也顯而易見(jiàn),數(shù)據(jù)庫(kù)的并發(fā)能力大大降低了抱婉。

共享鎖與獨(dú)占鎖

兩階段鎖的邏輯是通過(guò)共享鎖與獨(dú)占鎖共同來(lái)實(shí)現(xiàn)的:
如果事務(wù)A要讀取數(shù)據(jù),則必須先獲取共享鎖桌粉。數(shù)據(jù)庫(kù)允許多個(gè)事務(wù)同時(shí)擁有共享鎖蒸绩,但如果另一個(gè)事務(wù)擁有獨(dú)占鎖,則其他事務(wù)要獲取共享鎖則必須等待铃肯。

如果事務(wù)A要寫(xiě)入數(shù)據(jù)患亿,則必須先獲取獨(dú)占鎖。任何其他事務(wù)都不能同時(shí)擁有鎖押逼,(無(wú)論是共享還是獨(dú)占)因此如果對(duì)象上存在任何鎖步藕,事務(wù)A必須等待。

如果事務(wù)A先讀取數(shù)據(jù)挑格,然后寫(xiě)入數(shù)據(jù)咙冗。它可以將共享鎖升級(jí)為獨(dú)占鎖。升級(jí)與直接獲得獨(dú)占鎖相同漂彤。

在事務(wù)獲得鎖之后雾消,它必須繼續(xù)持有鎖直到事務(wù)結(jié)束(提交或中止)灾搏。這就是“兩階段”的名稱:第一階段在獲取鎖時(shí),第二階段釋放鎖立润。

由于使用了這么多鎖狂窑,所以很容易發(fā)生事務(wù)A被卡住等待事務(wù)B釋放它的鎖,反之亦然桑腮。這種情況稱為死鎖泉哈。數(shù)據(jù)庫(kù)自動(dòng)檢測(cè)死鎖之后會(huì)終止事務(wù),然后重啟事務(wù)排隊(duì)破讨。

序列化的快照隔離(SSI)

兩階段鎖(2PL)由于采取了悲觀的并發(fā)控制丛晦,不但容易引起死鎖,且性能低下添忘。所以接下來(lái)我們要來(lái)看看序列化的快照隔離(SSI)采呐,它提供了完整的串行化,但是只有很小的性能損失相比兩階段鎖搁骑。

當(dāng)我們以前討論快照隔離中的并發(fā)寫(xiě)問(wèn)題斧吐,是因?yàn)槭聞?wù)從數(shù)據(jù)庫(kù)讀取一些數(shù)據(jù),檢查讀取結(jié)果仲器,并決定根據(jù)它看到的結(jié)果采取一些操作煤率。然而,在快照隔離的情況下乏冀,原始查詢的結(jié)果在事務(wù)提交時(shí)可能不再是最新的蝶糯,因?yàn)閿?shù)據(jù)可能在此期間進(jìn)行了修改。所以查詢和事務(wù)中的寫(xiě)之間可能存在因果依賴關(guān)系辆沦。為了提供串行化隔離昼捍,數(shù)據(jù)庫(kù)可以檢測(cè)到這種情況,并且終止不合法的事務(wù)肢扯。

檢測(cè)是否讀取舊的數(shù)據(jù)

快照隔離通常采用多版本并發(fā)控制實(shí)現(xiàn)妒茬,當(dāng)一個(gè)事務(wù)讀取一個(gè)數(shù)據(jù)庫(kù)的一致性快照,它忽略了新的寫(xiě)入蔚晨。為了防止這種異常乍钻,數(shù)據(jù)庫(kù)需要跟蹤事務(wù)時(shí)讀取時(shí)是否忽略了另一個(gè)事務(wù)的寫(xiě)操作,當(dāng)事務(wù)要提交時(shí)铭腕,數(shù)據(jù)庫(kù)檢查任何已忽略的寫(xiě)操作银择。如果忽略了寫(xiě)操作,則必須中止事務(wù)累舷。

為什么要等到提交時(shí)浩考,而不是檢測(cè)到讀取舊數(shù)據(jù)時(shí)就立即終止事務(wù)呢?那么被盈,如果事務(wù)如果是只讀事務(wù)怀挠,則不需要中止析蝴,在事務(wù)進(jìn)行讀取時(shí),數(shù)據(jù)庫(kù)還不知道該事務(wù)是否稍后將執(zhí)行寫(xiě)入操作绿淋。上文Alice與Bob請(qǐng)假的例子可以通過(guò)這樣的方式避免并發(fā)寫(xiě)的問(wèn)題:


檢測(cè)到讀取了舊的數(shù)據(jù)闷畸,事務(wù)終止
檢測(cè)影響先前讀取的寫(xiě)入

如果并沒(méi)有檢測(cè)到讀取了舊的數(shù)據(jù),仍然有可能出現(xiàn)并發(fā)寫(xiě)入的問(wèn)題吞滞。

所以當(dāng)事務(wù)寫(xiě)入數(shù)據(jù)庫(kù)時(shí)佑菩,它記錄讀取受影響數(shù)據(jù)的任何其他事務(wù)的索引。一旦第一個(gè)事務(wù)是成功提交裁赠,其他所有相關(guān)的索引事務(wù)必須終止殿漠。通過(guò)這樣快照隔離的方式,保證了并發(fā)寫(xiě)入的安全性佩捞。同樣是上文的例子绞幌,下圖暫時(shí)了索引終止技術(shù):

通過(guò)事務(wù)索引終止了被影響數(shù)據(jù)的其他事務(wù)

許多工程細(xì)節(jié)影響算法在實(shí)踐中的工作效果。跟蹤事務(wù)的讀寫(xiě)的粒度一忱。如果數(shù)據(jù)庫(kù)非常詳細(xì)地跟蹤每一個(gè)事務(wù)的活動(dòng)莲蜘,那么它就可以精確地判斷哪些事務(wù)需要中止,但是這些開(kāi)銷(xiāo)會(huì)變得很大帘营。而不太詳細(xì)的跟蹤事務(wù)會(huì)更快速票渠,但可能導(dǎo)致更多的事務(wù)被中止。相比與兩階段鎖芬迄,可串行化隔離快照是大有好處的:一個(gè)事務(wù)不需要阻塞等待另一個(gè)事務(wù)持有的鎖问顷。

概念總結(jié)

臟讀

? 一個(gè)客戶端讀取到另一個(gè)客戶端尚未提交的寫(xiě)入。讀已提交或更強(qiáng)的隔離級(jí)別可以防止臟讀禀梳。


image

臟寫(xiě)

? 一個(gè)客戶端覆蓋寫(xiě)入了另一個(gè)客戶端尚未提交的寫(xiě)入杜窄。幾乎所有的事務(wù)實(shí)現(xiàn)都可以防止臟寫(xiě)。


臟寫(xiě)導(dǎo)致了數(shù)據(jù)的不一致性

讀取偏差(不可重復(fù)讀)

? 在同一個(gè)事務(wù)中算途,客戶端在不同的時(shí)間點(diǎn)會(huì)看見(jiàn)數(shù)據(jù)庫(kù)的不同狀態(tài)塞耕。快照隔離經(jīng)常用于解決這個(gè)問(wèn)題郊艘,它允許事務(wù)從一個(gè)特定時(shí)間點(diǎn)的一致性快照中讀取數(shù)據(jù)荷科∥ㄒВ快照隔離通常使用多版本并發(fā)控制(MVCC) 來(lái)實(shí)現(xiàn)纱注。


消失的100美元

更新丟失

? 兩個(gè)客戶端同時(shí)執(zhí)行讀取-修改-寫(xiě)入序列。其中一個(gè)寫(xiě)操作胆胰,在沒(méi)有合并另一個(gè)寫(xiě)入變更情況下狞贱,直接覆蓋了另一個(gè)寫(xiě)操作的結(jié)果。所以導(dǎo)致數(shù)據(jù)丟失蜀涨∠规遥快照隔離的一些實(shí)現(xiàn)可以自動(dòng)防止這種異常蝎毡,而另一些實(shí)現(xiàn)則需要手動(dòng)鎖定(SELECT FOR UPDATE)。


image.png

寫(xiě)偏差

? 一個(gè)事務(wù)讀取一些東西氧枣,根據(jù)它所看到的值作出決定沐兵,并將決定寫(xiě)入數(shù)據(jù)庫(kù)。但是便监,寫(xiě)作的時(shí)候扎谎,決定的前提不再是真實(shí)的。只有可序列化的隔離才能防止這種異常烧董。


image.png

幻讀

? 事務(wù)讀取符合某些搜索條件的對(duì)象毁靶。另一個(gè)客戶端進(jìn)行寫(xiě)入,影響搜索結(jié)果逊移≡み海快照隔離可以防止直接的幻像讀取,但是寫(xiě)入歪斜環(huán)境中的幻影需要特殊處理胳泉,例如索引范圍鎖定拐叉。

BEGIN TRANSACTION;

-- 檢查所有現(xiàn)存的與12:00~13:00重疊的預(yù)定
SELECT COUNT(*) FROM bookings
WHERE room_id = 123 AND 
    end_time > '2015-01-01 12:00' AND start_time < '2015-01-01 13:00';

-- 如果之前的查詢返回0
INSERT INTO bookings(room_id, start_time, end_time, user_id)
  VALUES (123, '2015-01-01 12:00', '2015-01-01 13:00', 666);

COMMIT;

弱隔離級(jí)別可以防止這些異常情況,但是讓?xiě)?yīng)用程序開(kāi)發(fā)人員手動(dòng)處理其他應(yīng)用程序(例如胶背,使用顯式鎖定)巷嚣。只有可序列化的隔離才能防范所有這些問(wèn)題。我們討論了實(shí)現(xiàn)可序列化事務(wù)的三種不同方法:

字面意義上的串行執(zhí)行

? 如果每個(gè)事務(wù)的執(zhí)行速度非城鳎快廷粒,并且事務(wù)吞吐量足夠低,足以在單個(gè)CPU核上處理红且,這是一個(gè)簡(jiǎn)單而有效的選擇坝茎。

兩階段鎖定

? 數(shù)十年來(lái),兩階段鎖定一直是實(shí)現(xiàn)可序列化的標(biāo)準(zhǔn)方式暇番,但是許多應(yīng)用出于性能問(wèn)題的考慮避免使用它嗤放。

可串行化快照隔離(SSI)

? 一個(gè)相當(dāng)新的算法,避免了先前方法的大部分缺點(diǎn)壁酬。它使用樂(lè)觀的方法次酌,允許事務(wù)執(zhí)行而無(wú)需阻塞。當(dāng)一個(gè)事務(wù)想要提交時(shí)舆乔,它會(huì)進(jìn)行檢查岳服,如果執(zhí)行不可序列化,事務(wù)就會(huì)被中止希俩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吊宋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颜武,更是在濱河造成了極大的恐慌璃搜,老刑警劉巖拖吼,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異这吻,居然都是意外死亡吊档,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)唾糯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)籍铁,“玉大人,你說(shuō)我怎么就攤上這事趾断【苊” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵芋酌,是天一觀的道長(zhǎng)增显。 經(jīng)常有香客問(wèn)我,道長(zhǎng)脐帝,這世上最難降的妖魔是什么同云? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮堵腹,結(jié)果婚禮上炸站,老公的妹妹穿的比我還像新娘。我一直安慰自己疚顷,他們只是感情好旱易,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著腿堤,像睡著了一般阀坏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笆檀,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天忌堂,我揣著相機(jī)與錄音,去河邊找鬼酗洒。 笑死士修,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的樱衷。 我是一名探鬼主播棋嘲,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼箫老!你這毒婦竟也來(lái)了封字?” 一聲冷哼從身側(cè)響起黔州,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耍鬓,失蹤者是張志新(化名)和其女友劉穎阔籽,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牲蜀,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笆制,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涣达。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片在辆。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖度苔,靈堂內(nèi)的尸體忽然破棺而出匆篓,到底是詐尸還是另有隱情,我是刑警寧澤寇窑,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布鸦概,位于F島的核電站,受9級(jí)特大地震影響甩骏,放射性物質(zhì)發(fā)生泄漏窗市。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一饮笛、第九天 我趴在偏房一處隱蔽的房頂上張望咨察。 院中可真熱鬧,春花似錦福青、人聲如沸摄狱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)二蓝。三九已至,卻和暖如春指厌,著一層夾襖步出監(jiān)牢的瞬間刊愚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工踩验, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸥诽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓箕憾,卻偏偏與公主長(zhǎng)得像牡借,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袭异,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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