自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談數(shù)據(jù)庫事務(wù)隔離發(fā)展歷史

數(shù)據(jù)庫
事務(wù)隔離是數(shù)據(jù)庫系統(tǒng)設(shè)計中根本的組成部分,本文主要從標(biāo)準(zhǔn)層面來討論隔離級別的發(fā)展歷史,首先明確隔離級別劃分的目標(biāo);之后概述其否定之否定的發(fā)展歷程;進而引出 Adya給出的比較合理的隔離級別定義,最終總結(jié)隔離標(biāo)準(zhǔn)一路走來的思路。

事務(wù)隔離是數(shù)據(jù)庫系統(tǒng)設(shè)計中根本的組成部分,本文主要從標(biāo)準(zhǔn)層面來討論隔離級別的發(fā)展歷史,首先明確隔離級別劃分的目標(biāo);之后概述其否定之否定的發(fā)展歷程;進而引出 Adya給出的比較合理的隔離級別定義,最終總結(jié)隔離標(biāo)準(zhǔn)一路走來的思路。

目標(biāo)

事務(wù)隔離是事務(wù)并發(fā)產(chǎn)生的直接需求,最直觀的、保證正確性的隔離方式,顯然是讓并發(fā)的事務(wù)依次執(zhí)行,或是看起來像是依次執(zhí)行。但在真實的場景中,有時并不需要如此高的正確性保證,因此希望犧牲一些正確性來提高整體性能。通過區(qū)別不同強度的隔離級別使得使用者可以在正確性和性能上自由權(quán)衡。隨著數(shù)據(jù)庫產(chǎn)品數(shù)量以及使用場景的膨脹,帶來了各種隔離級別選擇的混亂,數(shù)據(jù)庫的眾多設(shè)計者和使用者亟需一個對隔離級別劃分的共識,這就是標(biāo)準(zhǔn)出現(xiàn)的意義。一個好的隔離級別定義有如下兩個重要的目標(biāo):

正確:每個級別的定義,應(yīng)該能夠?qū)⑺袚p害該級別想要保證的正確性的情況排除在外。也就是說,只要實現(xiàn)滿足某一隔離級別定義,就一定能獲得對應(yīng)的正確性保證。 實現(xiàn)無關(guān):常見的并發(fā)控制的實現(xiàn)方式包括,鎖、OCC以及多版本 。而一個好的標(biāo)準(zhǔn)不應(yīng)該限制其實現(xiàn)方式。ANSI SQL標(biāo)準(zhǔn)(1992):基于異象

1992年ANSI首先嘗試指定統(tǒng)一的隔離級別標(biāo)準(zhǔn),其定義了不同級別的異象(phenomenas), 并依據(jù)能避免多少異象來劃分隔離標(biāo)準(zhǔn)。異象包括:

臟讀(Dirty Read): 讀到了其他事務(wù)還未提交的數(shù)據(jù);不可重復(fù)讀(Non-Repeatable/Fuzzy Read):由于其他事務(wù)的修改或刪除,對某數(shù)據(jù)的兩次讀取結(jié)果不同;幻讀(Phantom Read):由于其他事務(wù)的修改,增加或刪除,導(dǎo)致Range的結(jié)果失效(如where 條件查詢)。通過阻止不同的異象發(fā)生,得到了四種不同級別的隔離標(biāo)準(zhǔn):

ANSI SQL標(biāo)準(zhǔn)看起來是非常直觀的劃分方式,不想要什么就排除什么,并且做到了實現(xiàn)無關(guān)。然而,現(xiàn)實并不像想象美好。因為它并不正確。

A Critique of ANSI(1995):基于鎖

幾年后,微軟的研究員們在A Critique of ANSI SQL Isolation Levels一文中對ANSI的標(biāo)準(zhǔn)進行了批判,指出其存在兩個致命的問題:

1,不完整,缺少對Dirty Write的排除

ANSI SQL標(biāo)準(zhǔn)中所有的隔離級別都沒有將Dirty Write這種異象排除在外,所謂Dirty Write指的是兩個未提交的事務(wù)先后對同一個對象進行了修改。而Dirty Write之所以是一種異象,主要因為他會導(dǎo)致下面的一致性問題:

H0: w1[x] w2[x] w2[y] c2 w1[y] c1

這段歷史中,假設(shè)有相關(guān)性約束x=y,T1嘗試將二者都修改為1,T2嘗試將二者都修改為2,順序執(zhí)行的結(jié)果應(yīng)該是二者都為1或者都為2,但由于Dirty Write的發(fā)生,最終結(jié)果變?yōu)閤=2,y=1,不一致。

2,歧義

ANSI SQL的英文表述有歧義。以Phantom為例,如下圖歷史H3:

H3:r1[P] w2[insert y to P] r2[z] w2[z] c2 r1[z] c1

假設(shè)T1根據(jù)條件P查詢所有的雇員列表,之后T2增加了一個雇員并增加了雇員人數(shù)值z,之后T1讀取雇員人數(shù)z,最終T1的列表中的人數(shù)比z少,不一致。但T1并沒有在T2修改鏈表后再使用P中的值,是否就不屬于ANSI中對Phantom的定義了呢?這也導(dǎo)致了對ANSI的表述可能有嚴(yán)格和寬松兩種解讀。對于Read Dirty和Non-Repeatable/Fuzzy Read也有同樣的問題。

那么,如何解決上述兩個問題呢?Critique of ANSI的答案是:寧可錯殺三千,不可放過一個,即給ANSI標(biāo)準(zhǔn)中的異象最嚴(yán)格的定義。Critique of ANSI改造了異象的定義:

P0: w1[x]…w2[x]…(c1 or a1) (Dirty Write)

P1: w1[x]…r2[x]…(c1 or a1) (Dirty Read)

P2: r1[x]…w2[x]…(c1 or a1) (Fuzzy or Non-Repeatable Read)

P3: r1[P]…w2[y in P]…(c1 or a1) (Phantom)

此時定義已經(jīng)很嚴(yán)格了,直接阻止了對應(yīng)的讀寫組合順序。仔細可以看出,此時得到的其實就是基于鎖的定義:

Read Uncommitted,阻止P0:整個事務(wù)階段對x加長寫鎖Read Commited,阻止P0,P1:短讀鎖 + 長寫鎖Repeatable Read,阻止P0,P1,P2:長讀鎖 + 短謂詞鎖 + 長寫鎖Serializable,阻止P0,P1,P2,P3:長讀鎖 + 長謂詞鎖 + 長寫鎖問題本質(zhì)

可以看出,這種方式的隔離性定義保證了正確性,但卻產(chǎn)生了依賴實現(xiàn)方式的問題:太過嚴(yán)格的隔離性定義,阻止了Optimize或Multi-version的實現(xiàn)方式中的一些正常的情況:

針對P0:Optimize的實現(xiàn)方式可能會讓多個事務(wù)各自寫自己的本地副本,提交的時候只要順序合適是可以成功的,只在需要的時候才abort,但這種選擇被P0阻止;針對P2:只要T1沒有在讀x,后續(xù)沒有與x相關(guān)的操作,且先于T2提交。在Optimize的實現(xiàn)中是可以接受的,卻被P2阻止?;貞汣ritique of ANSI中指出的ANSI標(biāo)準(zhǔn)問題,包括Dirty Write和歧義,其實都是由于多Object之間有相互約束關(guān)系導(dǎo)致的,如下圖所示,圖中黑色部分表示的是ANSI中針對某一個異象描述的異常情況,灰色部分由于多Object約束導(dǎo)致的異常部分,但這部分在傳統(tǒng)的異象定義方式中并不能描述,因此其只能退而求其次,擴大限制的范圍到黃色部分,從而限制了正常的情況。

由此,可以看出問題的本質(zhì):由于異象的描述只針對單個object,缺少描述多object之間的約束關(guān)系,導(dǎo)致需要用鎖的方式來作出超出必須的限制。相應(yīng)地,解決問題的關(guān)鍵:要有新的定義異象的模型,使之能精準(zhǔn)的描述多object之間的約束關(guān)系,從而使得我們能夠精準(zhǔn)地限制上述灰色部分,而將黃色的部分解放出來。Adya給出的答案是序列化圖。

A Generalized Theory(1999):基于序列化圖

Adya在Weak Consistency: A Generalized Theory and Optimistic Implementations for Distributed Transactions中給出了基于序列化圖得定義,思路為先定義沖突關(guān)系;并以沖突關(guān)系為有向邊形成序列化圖;再以圖中的環(huán)類型定義不同的異象;最后通過阻止不同的異象來定義隔離級別。

序列化圖(Direct Serialization Graph, DSG)

序列化圖是用有向圖的方式來表示事務(wù)相互之間的依賴關(guān)系,圖中每個節(jié)點表示一個事務(wù),有向邊表示存在一種依賴關(guān)系,事務(wù)需要等到所有指向其的事務(wù)先行提交,如下圖所示歷史的合法的提交順序應(yīng)該為:T1,T2,T3:

這里的有向邊包括三種情況:

  • 寫寫沖突ww(Directly Write-Depends):表示兩個事務(wù)先后修改同一個數(shù)據(jù)庫Object(w1[x]…w2[x]...); 先寫后讀沖突wr(Directly Read-Depends):一個事務(wù)修改某個數(shù)據(jù)庫Object后,另一個對該Object進行讀操作(w1[x]…r2[x]...); 先讀后寫沖突rw(Directly Anti-Depends):一個事務(wù)讀取某個Object或者某個Range后,另一個事務(wù)進行了修改(r1[x]…w2[x]… or r1[P]…w2[y in P]);
  • 基于序列化圖的異象定義:
  • 根據(jù)有向圖的定義,我們可以將事務(wù)對不同Object的依賴關(guān)系表示到一張同一張圖中,而所謂異象就是在圖中找不到一個正確的序列化順序,即存在某種環(huán)。而這種基于環(huán)的定義其實就是將基于Lock定義的異象最小化到圖中灰色部分:
  • 1,P0(Dirty Write) 最小化為 G0(Write Cycles):序列化圖中包含兩條邊都為ww沖突組成的環(huán),如H0:

H0: w1[x] w2[x] w2[y] c2 w1[y] c1

  • 可以看出T1在x上與T2寫寫沖突,T2又在y上與T1寫寫沖突,形成了如下圖所示的環(huán)。
  • 2,P1(Dirty Read) 最小化為 G1:Dirty Read異象的最小集包括三個部分G1a(Aborted Reads),讀到的uncommitted數(shù)據(jù)最終被abort;G1b(Intermediate Reads) :讀到其他事務(wù)中間版本的數(shù)據(jù);以及G1c(Circular Information Flow):DSG中包含ww沖突和wr沖突形成的環(huán)。
  • 3,P2(Fuzzy or Non-Repeatable Read) 最小化為 G2-item(Item Anti-dependency Cycles) :DSG中包含環(huán),且其中至少有一條關(guān)于某個object的rw沖突
  • 4,P3(Phantom) 最小化為 G2(Anti-dependency Cycles): DSG中包含環(huán),并且其中至少有一條是rw沖突,仍然以上面的H3為例:

H3:r1[P] w2[insert y to P] r2[z] w2[z] c2 r1[z] c1

  • T1在謂詞P上與T2 rw沖突,反過來T2又在z上與T1wr沖突,如下圖所示:
  • 對應(yīng)的隔離級別:
  • 通過上面的討論可以看出,通過環(huán)的方式我們成功最小化了異象的限制范圍,那么排除這些異象就得到了更寬松的,通用的隔離級別定義:

PL-1(Read Uncommitted):阻止G0PL-2(Read Commited):阻止G1PL-2.99(Repeatable Read):阻止G1,G2-itemPL-3(Serializable):阻止G1,G2其他隔離級別:

  • 除了上述的隔離級別外,在正確性的頻譜中還有著大量空白,也就存在著各種其他隔離級別的空間,商業(yè)數(shù)據(jù)庫的實現(xiàn)中有兩個比較常見:
  • 1,Cursor Stability
  • 該隔離界別介于Read Committed和Repeatable Read之間,通過對游標(biāo)加鎖而不是對object加讀鎖的方式避免了Lost Write異象。
  • 2, Snapshot Ioslation
  • 事務(wù)開始的時候拿一個Start-Timestamp的snapshot,所有的操作都在這個snapshot上做,當(dāng)commit的時候拿Commit-Timestamp,檢查所有有沖突的值不能再[Start- Timestamp, Commit-Timestamp]被提交,否則abort。長久以來,Snapshot Ioslation一直被認(rèn)為是Serializable,但其實Snapshot Ioslation下還會出現(xiàn)Write Skew的異象。之后的文章會詳細介紹如何從Snapshot Ioslation出發(fā)獲得Serializable。

總結(jié)

  • 對于事務(wù)隔離級別的標(biāo)準(zhǔn),數(shù)據(jù)庫的前輩們進行了長久的探索:

ANSI isolation levels定義了異象標(biāo)準(zhǔn),并根據(jù)所排除的異象,定義了,Read Uncommitted、Read Committed、Repeatable Read、Serializable四個隔離級別; A Critique of ANSI SQL Isolation Levels認(rèn)為ANSI的定義并沒將有多object約束的異象排除在外,并選擇用更嚴(yán)格的基于Lock的定義擴大了每個級別限制的范圍; Weak Consistency: A Generalized Theory and Optimistic Implementations for Distributed Transactions認(rèn)為基于Lock的定義過多的擴大了限制的范圍,導(dǎo)致正常情況被排除在外,從而限制了Optimize類型并行控制的使用;指出解決該問題的關(guān)鍵是要有模型能準(zhǔn)確地描述這種多Object約束;并給出了基于序列化圖的定義方式,將每個級別限制的范圍最小化。參考

  • A History of Transaction Histories
  • ANSI isolation levels
  • A Critique of ANSI SQL Isolation Levels
  • Weak Consistency: A Generalized Theory and Optimistic Implementations for Distributed Transactions
  • Generalized Isolation Level Definitions

 

責(zé)任編輯:龐桂玉 來源: 快資訊
相關(guān)推薦

2023-10-11 08:09:53

事務(wù)隔離級別

2018-07-20 11:10:21

數(shù)據(jù)庫事務(wù)隔離性

2009-06-29 17:54:47

Spring事務(wù)隔離

2020-03-05 09:33:15

數(shù)據(jù)庫事務(wù)隔離事務(wù)

2018-07-17 10:58:45

數(shù)據(jù)庫數(shù)據(jù)庫事務(wù)隔離級別

2020-08-31 07:00:00

數(shù)據(jù)庫數(shù)據(jù)庫同步

2019-05-05 16:13:07

關(guān)系型數(shù)據(jù)庫OracleMySQL

2025-02-08 12:05:44

MySQLMyISAMInnoDB

2018-10-17 09:55:06

數(shù)據(jù)庫隔離級別MySQL

2021-11-26 22:07:57

數(shù)據(jù)庫管理Mongodb

2010-10-08 09:38:55

Android數(shù)據(jù)庫事

2009-09-24 14:12:22

Hibernate數(shù)據(jù)

2023-06-01 07:37:48

級別事務(wù)調(diào)度

2019-08-13 15:52:34

數(shù)據(jù)庫同步遷移

2009-04-16 09:08:21

Oracle開發(fā)經(jīng)驗

2023-09-01 07:30:59

2025-04-08 06:00:00

2024-05-28 00:00:30

Golang數(shù)據(jù)庫

2020-06-17 16:56:36

數(shù)據(jù)庫MySQL跨行事務(wù)

2017-08-22 17:10:45

數(shù)據(jù)庫MySQL事務(wù)模型
點贊
收藏

51CTO技術(shù)棧公眾號