您好,登錄后才能下訂單哦!
淺談對(duì)數(shù)據(jù)庫(kù)隔離級(jí)別的理解
當(dāng)人們提及數(shù)據(jù)庫(kù)管理系統(tǒng) (DBMS),必會(huì)提及事務(wù)、 ACID特性以及事務(wù)隔離級(jí)別。 事務(wù)本身是為了保證系統(tǒng)的運(yùn)行狀態(tài)最終將處于一致性 (滿足一組約束條件 )的狀態(tài)而出現(xiàn)的概念,其中的 ACID特性中的 I(Isolation)要保證在并發(fā)操作情況下 數(shù)據(jù)庫(kù) 最終可以處于 ”一致 ”的狀態(tài)。但是自問一下便會(huì)產(chǎn)生諸多疑點(diǎn) : 到底什么是事務(wù)隔離級(jí)別?為什么要有事務(wù)隔離級(jí)別?作為理論基礎(chǔ)的每種隔離級(jí)別如何定義以及分別有什么作用呢?下面主要結(jié)合經(jīng)典論文 [1]和相關(guān)經(jīng)驗(yàn)來(lái)簡(jiǎn)要地談?wù)勛约旱睦斫狻?/p>
(一 ) 到底什么是事務(wù)隔離級(jí)別?為什么要有事務(wù)隔離級(jí)別?
事務(wù)四大特性 ACID中的 I(Isolation)字面意思是 ”隔離性 ”,實(shí)質(zhì)上就是指對(duì)數(shù)據(jù)操作的并發(fā)控制。那么該問題換句話說(shuō)即, 為什么需要并發(fā)控制?它解決了什么問題?
在數(shù)據(jù)庫(kù)中, 如果對(duì)于同一數(shù)據(jù)項(xiàng)的所有事務(wù)操作都被串行化地執(zhí)行,那么執(zhí)行過程與結(jié)果是沒有問題的。如果存在并發(fā)操作,即多個(gè)事務(wù)的生命周期 (時(shí)間區(qū)間 )之間存在交集,就 可能產(chǎn)生操作上的沖突和依賴,進(jìn)而引發(fā)異?,F(xiàn)象。對(duì)于同一數(shù)據(jù)項(xiàng),兩個(gè)并發(fā)操作的執(zhí)行過程一定是有先后而非物理上的同時(shí)的,其結(jié)果取決于爭(zhēng)搶與調(diào)度策略。 操作順序類型可以分為 讀 -讀、讀 -寫、寫 -讀、寫 -寫 4種類型,其中后三種包含寫的操作序列是有沖突的, 它們可能會(huì)引發(fā)執(zhí)行結(jié)果的異常,或者叫異?,F(xiàn)象 (Anomaly)。
例如,有如下命令在沒有任何并發(fā)控制機(jī)制 (比如鎖 )的情況下按如下調(diào)度順序執(zhí)行 :
時(shí)刻 |
事務(wù) 1 |
事務(wù) 2 |
t0 |
BEGIN; // x = 10 |
BEGIN; |
t1 |
w1[x]: 更新 x = x + 1; // x = 11 |
|
t2 |
|
r2[x]: read x; // x = 11,依賴 w1[x] |
t3 |
a1: abort(引發(fā)回滾 ); // x = 10 |
|
t4 |
|
更新 y : = x |
表 1.
這樣構(gòu)成的 執(zhí)行序列模式 (現(xiàn)象 )是 w1[x]...r2[x]...a1...,符合 “寫 -讀 ” 的沖突模式,而上述 case確實(shí)產(chǎn)生了異常,即 :
(1) 按照上述執(zhí)行序列,事務(wù) 2讀取的數(shù)據(jù)是事務(wù) 1未提交的臟數(shù)據(jù) x = 11,實(shí)際上是不應(yīng)當(dāng)被事務(wù) 2看到的不一致的數(shù)據(jù),如果該數(shù)據(jù)被事務(wù) 2后續(xù)應(yīng)用于更新某條記錄 y := 11,那么將導(dǎo)致數(shù)據(jù)庫(kù)的狀態(tài)不一致。 (這便是大家所知的 ”臟讀 ” )
(2) 如果把事務(wù) 1放在事務(wù) 2之前執(zhí)行,那么這是串行化的事務(wù)執(zhí)行方式,這時(shí)事務(wù) 2讀到的 x值應(yīng)該是事務(wù) 1未開始前的值 (已回滾 ),即 x = 10,這是正確的結(jié)果。具體如下 :
時(shí)刻 |
事務(wù) 1 |
事務(wù) 2 |
t0 |
BEGIN; // x = 10 |
|
t1 |
w1[x]: 更新 x = x + 1; // x = 11 |
|
t2 |
a1: abort(引發(fā)回滾 ); // x = 10,結(jié)束 |
|
|
|
BEGIN; // x = 10,與事務(wù)1串行,無(wú)問題 |
t3 |
|
r2[x]: read x; // x = 10 |
t4 |
|
更新 y : = x |
|
|
... ... |
表 2.
這樣, (1), (2) 兩種調(diào)度方式所對(duì)應(yīng)的保序的執(zhí)行序列產(chǎn)生的結(jié)果是不一樣的, (2)串行化執(zhí)行是正確的, (1)的結(jié)果 (因?yàn)榕K讀 )產(chǎn)生了不一致的數(shù)據(jù)狀態(tài)。
上述異常只是諸多類異常中的一種,并發(fā)控制就是要解決這些異常,但是并發(fā)控制需要達(dá)到什么程度呢?因?yàn)椴l(fā)控制程度高對(duì)應(yīng)著并發(fā)執(zhí)行效率低,數(shù)據(jù)庫(kù)用戶并非時(shí)刻都需要最強(qiáng)的并發(fā)控制方式,這是一致性與并發(fā)度的權(quán)衡,隔離級(jí)別就是這一權(quán)衡的控制參數(shù)。
我們把事務(wù)及事務(wù)隔離級(jí)別的語(yǔ)境設(shè)定在數(shù)據(jù)庫(kù)系統(tǒng)上,那么可以認(rèn)為 :
從數(shù)據(jù)庫(kù)使用者的角度來(lái)看, 異常現(xiàn)象是并發(fā)操作時(shí)可能出現(xiàn)的問題, 并發(fā)控制是避免某些異常現(xiàn)象導(dǎo)致問題的過程或手段, 隔離級(jí)別是對(duì)并發(fā)控制程度的 抽象描述。即 數(shù)據(jù)庫(kù)使用者通過設(shè)定事務(wù)隔離級(jí)別,來(lái)配置數(shù)據(jù)庫(kù)系統(tǒng),使之在并發(fā)操作時(shí)能夠規(guī)避某些異?,F(xiàn)象。
從數(shù)據(jù)庫(kù)開發(fā)者的角度來(lái)看,需要解決并發(fā)操作時(shí)的 異?,F(xiàn)象是根本需求,而 隔離級(jí)別是把這些無(wú)窮多的現(xiàn)象級(jí)需求進(jìn)行了分類、抽象、歸納,將 規(guī)避異?,F(xiàn)象之需求轉(zhuǎn)化為了 滿足有限種類隔離級(jí)別之需求。即 數(shù)據(jù)庫(kù)開發(fā)者只需要實(shí)現(xiàn)定義好的幾種隔離級(jí)別,就可以為數(shù)據(jù)庫(kù)系統(tǒng)提供規(guī)避某些 (可能是無(wú)窮多 )異?,F(xiàn)象的功能。具體 DBMS中的隔離級(jí)別的定義可能會(huì)有區(qū)別,但實(shí)現(xiàn)上至少需要不弱于 ANSI-SQL標(biāo)準(zhǔn)。
隔離級(jí)別如何設(shè)定是與異?,F(xiàn)象 /行為序列的分類、歸納方式有密切聯(lián)系的。要想嚴(yán)謹(jǐn) (從數(shù)學(xué)上 )地定義隔離級(jí)別,必然需要對(duì)異?,F(xiàn)象給出形式 (而嚴(yán)格 )化的定義。
本節(jié)要點(diǎn) :
-> 并發(fā)事務(wù)導(dǎo)致執(zhí)行結(jié)果破壞某些約束 (問題源頭 ) -> 起因歸為讀寫沖突 (w-w/w-r/r-w) -> 異?,F(xiàn)象 (Anomaly)(不完全 )歸納為異常模式 -> 更廣義的行為序列 (現(xiàn)象 -Phenomenon)被歸納為行為序列模式 -> 禁止行為序列或異常序列模式可規(guī)避某些并發(fā)操作問題 -> 根據(jù)行為序列模式的歸納來(lái)定義 : 解決某些問題即符合特定隔離級(jí)別。 |
(二 ) 如何標(biāo)準(zhǔn)化、形式化地描述并發(fā)讀寫的 (異常 )現(xiàn)象?如何理解它們?
在論文 [1]中,已經(jīng)給出了并發(fā)操作的異?,F(xiàn)象或者普通現(xiàn)象的形式化描述。即 使用 行為序列描述一系列操作過程,其中行為被簡(jiǎn)化抽象為讀、寫兩種類型,數(shù)字標(biāo)注表示行為的所屬事務(wù) (事務(wù) N),括號(hào)中的參數(shù)表示操作對(duì)象 (x,y,z,...)。形如 ”w1[x]...r2[x]...”就表示一個(gè)行為序列模式(表3-P2),那么對(duì) 行為序列的形式化定義可以看做是 行為序列模式,是對(duì)具有一定共性 ( 特征 )的行為序列的抽象表達(dá)。它表達(dá)了 某種模式的行為序列的集合。
下文分為幾個(gè)部分 : 行為序列模式的形式化定義、操作對(duì)象分類、形象化理解、各類模式匯總,來(lái)對(duì)本節(jié)的問題進(jìn)行說(shuō)明。 ( 以下均以單版本值的情況進(jìn)行說(shuō)明,不考慮 MVCC)
* 行為序列模式的場(chǎng)景分類 : (P0-P3,A5 等定義見 表3.)
分類
1.
單條數(shù)據(jù)的并發(fā)操作現(xiàn)象
(
one data item)
>>
單條數(shù)據(jù)的讀寫操作序列的形式化描述是完備的,對(duì)應(yīng)于
P0(w-w沖突
),P1(w-r沖突
),P2(r-w沖突
) 三類讀寫沖突
(r-r沒有沖突
);
分類 2. 數(shù)據(jù)集合的并發(fā)操作現(xiàn)象 ( one data set of data items)
>> 數(shù)據(jù)集操作對(duì)應(yīng)于 P3(潛在幻象 );
分類 3. 帶約束的數(shù)據(jù)項(xiàng)操作現(xiàn)象 ( data items with constraints)
>> 具有關(guān)聯(lián)約束的數(shù)據(jù)操作對(duì)應(yīng)于 A5(A5A(r-w-w-r),A5B(r-r-w-w),...)以及其它可能的涉及數(shù)據(jù)關(guān)聯(lián)約束的行為模式;
* 常見的行為序列模式及其形式化定義 (包含了異常序列模式 )
常見現(xiàn)象 |
異?,F(xiàn)象集合 /模式 (原始 ANSI-SQL標(biāo)準(zhǔn)所涉及 ) |
普通現(xiàn)象集合 /模式 (包含了相應(yīng)異常現(xiàn)象, ) (增強(qiáng)版 ANSI-SQL隔離級(jí)別 ) |
e.g. 臟寫 記錄 w-w 沖突 |
未定義 A0 |
P0: w1[x]...w2[x]...(c1/a1/c2/a2) |
e.g. 臟讀 記錄 w-r 沖突 |
A1: w1[x]... r2[x]...a1 先寫后讀 ; |
P1: w1[x]...r2[x]...(c1/a1/c2/a2) P1包含 A1; |
e.g. 不可重復(fù)讀 記錄 r-w 沖突 |
A2: r1[x]...w2[x]...c2... r1[x] 先讀后寫 ; |
P2: r1[x]...w2[x]...(c1/a1/c2/a2) P2包含 A2; |
e.g. 幻象 集合 r-w沖突 |
A3: r1[P]...w2[x in P]...c2...r1[P] 先讀后寫 ; |
P3: r1[P]...w2[x in P]...(c1/a1/c2/a2) P3包含 A3; |
e.g. 寫丟失 記錄 r-w-w沖突 |
- |
P4: r1[x]... w2[x]...w1[x]...c1 P2包含 P4, 先讀后寫 ; |
e.g. 讀偏斜 關(guān)聯(lián)數(shù)據(jù)沖突 |
A5A: (屬于 A5類模式 ) r1[x]...w2[x]...w2[y]...c2... r1[y] 先讀后寫 ; |
P2包含 P4 |
e.g. 寫偏斜 關(guān)聯(lián)數(shù)據(jù)沖突 |
A5B: (屬于 A5類模式 ) r1[x]...r2[y]... w1[y]...w2[x]...(c1/c2) 先讀后寫 ; |
P2包含 A5 |
... (等等 ) |
... |
... |
表 3.
說(shuō)明 : (以下說(shuō)明不是最重點(diǎn)的,主要是為后面的 行為模式關(guān)系圖做鋪墊,可對(duì)照查看 )
(1) 行為序列說(shuō)明 : 例如, P1: w1[x]...r2[x]...(c1/a1/c2/a2),要表達(dá)的是 事務(wù) 1寫數(shù)據(jù)項(xiàng) x,之后 (還可能經(jīng)歷其它數(shù)據(jù)項(xiàng) /事務(wù)的操作 ),事務(wù) 2寫數(shù)據(jù) x,之后,事務(wù) 1/2以任意順序和方式 (提交 /中止 )結(jié)束;
(2) 行為序列模式的語(yǔ)義 : 滿足某種模式 P的序列可以構(gòu)成一個(gè)集合,集合中有些具體序列 可能產(chǎn)生異常結(jié)果,也可能不會(huì)。比如,符合 P2模式的序列不一定就符合 A2(臟讀 ),而符合 A2的具體序列不一定就會(huì)造成真正的影響。 (比如 r2[x]中的讀取操作不被任何后續(xù)的應(yīng)用程序或人員的操作鎖依賴而僅僅看一下就丟棄了,那么就不會(huì)產(chǎn)生影響 )。
(3) A1-A3: 這 3種異?,F(xiàn)象序列模式是 ANSI-SQL定義隔離級(jí)別所使用的異常行為序列模式,但是這些描述的是某個(gè)具體種類的異常,對(duì)記錄級(jí)讀寫沖突的描述不夠完備,因此論文 [1]中提出了 P0-P3來(lái)擴(kuò)充 A1-A3。 (比如, A1模式為 : “w1[x]...r2[x]...a1”,是 3元組;而 P1模式為 : “w1[x]...r2[x]...”,是 2元組 (因?yàn)槿我獾慕Y(jié)束順序和方式 (c1/a1/c2/a2)并沒有夠成對(duì)序列模式的限制,因此可忽略 )。 顯然 A1是 P1的特例 , A2/P2,A3/P3類似 )
(4) 可串行化級(jí)別 : 上述 A1-A3的不完備也說(shuō)明了基于 A1-A3來(lái)定義的 ANSI-SQL隔離級(jí)別不夠嚴(yán)謹(jǐn) ( 具體見 (三 )的表 4 )。
(5) P4: 寫丟失現(xiàn)象
a) P4不同于 P0,雖然都涉及 w-w沖突,但是 P0的模式是 ”w1[x]-w2[x]-...”,而 P4的沖突是 ”r1[x]...w2[x]...w1[x]-...”,相對(duì)于 P0在最前面還有一次同一數(shù)據(jù)項(xiàng)的讀取操作,這暗示了后面的 w1[x]有可能依賴于 r1[x]的讀取結(jié)果,而 P0并沒有這一點(diǎn)。
b) P4”r1[x]...w2[x]...w1[x]-...c1”寫丟失現(xiàn)象被包含于 P2” r1[x]...w2[x]...”(先讀后寫 )。
(6) A5: 具有關(guān)聯(lián)約束的 兩個(gè)數(shù)據(jù)項(xiàng)的操作序列,可能會(huì)導(dǎo)致關(guān)聯(lián)約束被破壞 (可以是用戶自定義的約束 )。需要注意,基于任意多個(gè)數(shù)據(jù)項(xiàng)之間的關(guān)聯(lián)約束并未在文中明確定義,因此在 P0-P3,A5之外還存在著其它的異?,F(xiàn)象
a) A5A 讀偏斜 : 事務(wù) 1要讀取 2個(gè)具有一定約束的數(shù)據(jù)項(xiàng),需要 2次讀操作 (r1[x]......r1[y]),在它們之間被插入了事務(wù) 2的關(guān)于寫操作 (r1[x]... w1[x]...w2[y]...c2...r1[y]...),這樣在第二次讀操作時(shí)約束關(guān)系已經(jīng)被破壞了。
b) A5B 寫偏斜 : 兩個(gè)事務(wù)分別要先讀取一個(gè)數(shù)據(jù)項(xiàng) (r1[x]...r2[y]...),再根據(jù)讀到的值來(lái)計(jì)算并更新另一個(gè)數(shù)據(jù)項(xiàng) (...w1[y]...w2[x]),如果兩個(gè)事務(wù)無(wú)法可串行化的執(zhí)行,那么可能會(huì)出現(xiàn)破壞約束的情況。例如 :初值 x=y=50; r1[x=50]... r2[y=50]...w1[y:=x+1=]... ... ... ...
(7) P2: 不可重復(fù)讀現(xiàn)象,該現(xiàn)象是比較有意思的 :
a) P2包含了 A2,這在前面 (3)已經(jīng)提及。
b) P2包含了 P4,這在前面 (4)已經(jīng)提及。
c) P2包含了 A5A與 A5B,這在前面已經(jīng)提及。
(8) END
至此可見, A(i)序列模式 包含于 P(i)序列模式, i = 1,2,3 . 而 P0更是 A(i)類沒有定義出來(lái)的序列模式。 P(i)類模式 (w-w,w-r,r-w + 數(shù)據(jù)項(xiàng) /數(shù)據(jù)集合 ) 比 A(i)類異常集合更加完備。
Q. 不可重復(fù)讀現(xiàn)象 (A2/P2)與幻象現(xiàn)象 (A3/P3)的區(qū)別與聯(lián)系是什么?
A. 不可重復(fù)讀是僅僅針對(duì)單條數(shù)據(jù)。實(shí)際上可以認(rèn)為,幻象是針對(duì)數(shù)據(jù)集合的不可重復(fù)讀現(xiàn)象,因此幻象不僅包含了 MySQL中 RR隔離級(jí)別所能避免的幻讀 (因?yàn)椴迦?新數(shù)據(jù)導(dǎo)致集合不可重復(fù)讀 ),而是可以擴(kuò)展到 因?yàn)樵?/刪 /改數(shù)據(jù)記錄而導(dǎo)致的給定謂詞條件下的數(shù)據(jù)集合的不可重復(fù)讀。
例如 : SELECT pk_id FROM t WHERE cond;
在 RU(read uncommitted)隔離級(jí)別下,通過 WHERE條件相關(guān)的數(shù)據(jù)記錄進(jìn)行增 /刪 /改,即 可改變查詢結(jié)果集。這里需要改變的數(shù)據(jù)記錄是要引起 cond判定的變化的,否則并不能影響查詢結(jié)果。比如 INSERT一個(gè)滿足 cond的 key值, UPDATE一個(gè) key值 (其舊有或目標(biāo) key值滿足 cond), DELETE一個(gè) key值,都可以改變滿足 cond的查詢結(jié)果集。
* 異?,F(xiàn)象的形象化說(shuō)明
(1) 對(duì)于 A1-A2的異常 (A3類似于 A2)可以形象化表示為 ” V 型 ”異常 :
圖 1.
(2) 什么是 A5類異常?什么是讀傾斜、寫偏斜?
實(shí)際上論文 [1]中的 A5表達(dá)的是具有關(guān)聯(lián)約束的 兩個(gè)數(shù)據(jù)項(xiàng)的操作異常,其中 A5A(讀偏斜 read skew), A5B(寫偏斜 write skew),可形象化地做如下表示 : (PS: 這里為避免歧義,將 skew譯為偏斜,而非偏序 (一般容易理解為 partial ordering)。 )
圖 2.
* 各類常見行為模式 (現(xiàn)象 )的關(guān)系匯總
論文 [1]中將本節(jié)中提及的序列之間的關(guān)系隱含在隔離級(jí)別的分析中了,筆者特此將其總結(jié)成一張關(guān)系圖。 (下圖某些集合關(guān)系的細(xì)節(jié)有待商榷,但可據(jù)此有宏觀的認(rèn)識(shí) )
圖 3.
綜上,已經(jīng)對(duì)異?,F(xiàn)象做了一個(gè)匯總
: 形式化的表述與直觀上的描述。
現(xiàn)在有了異常現(xiàn)象,我們就看每種隔離級(jí)別是如何定義的以及解決了怎樣的異常呢?
(三 ) 如何嚴(yán)格地定義隔離級(jí)別?
有了 (二 )中的形式化定義,隔離級(jí)別就可以被相對(duì)嚴(yán)謹(jǐn)?shù)亩x了。這里將直接引用論文與書籍中的描述。這里在 (一 )的理解上,稍加修飾 : 隔離級(jí)別的定義可以有多種定義方式,但其要表達(dá)的根本意思是,如果一個(gè)事務(wù)系統(tǒng)在運(yùn)行時(shí)能夠規(guī)避某些問題集,那么該系統(tǒng)的事務(wù)將具有某種相應(yīng)的隔離級(jí)別,即 隔離級(jí)別抽象出 待規(guī)避的最小異?,F(xiàn)象集合。 至于 DBMS的某種隔離級(jí)別的實(shí)現(xiàn),是否還可能規(guī)避對(duì)應(yīng)級(jí)別的最小問題集以外的異常序列,并不做限制。
下面我們就來(lái)看看論文 [1]中是如何就隔離級(jí)別的幾種定義做遞進(jìn)式的說(shuō)明的。
1. ANSI-SQL92中定義的 4中隔離級(jí)別 (解決 A1-A3中的部分或者全部異常 ):
表 4. - [1]-table 1
然而,由于 (二 )中表 3.告訴我們 A1-A3對(duì)異常的定義并不完備,因此上述 ANSI-SQL隔離級(jí)別的定義是不夠完備的。尤其是僅因規(guī)避 A1-A3而得名的 ANOMALY-SERIALIABLE級(jí)別并不是真正的 可串行化 (SR)隔離級(jí)別,因?yàn)椴l(fā)事務(wù)在滿足可串行化隔離級(jí)別的情況下是沒有并發(fā)操作異常發(fā)生的 (理論保證 ),而 ANOMALY-SERIALIABLE級(jí)別無(wú)法避免 A5A,A5B等異常的發(fā)生。因此 需要將情況擴(kuò)充得更加完備,具體如下。
2. 基于 P0-P3的隔離級(jí)別定義 : (來(lái)自論文 [1])
經(jīng)過將 ANSI異常現(xiàn)象 A1-A3擴(kuò)充至 P0-P3,得到加強(qiáng)版 ANSI-SQL隔離級(jí)別定義 :
表 5. - [1]-table 3
以上已經(jīng)將定義進(jìn)行了將強(qiáng)處理,但是如何實(shí)現(xiàn)呢?老爺子 Jim Gray等人還根據(jù)各方資料總結(jié)了基于鎖機(jī)制的隔離級(jí)別定義,這算是一種可實(shí)現(xiàn)化角度的定義,具體如下。
3. 基于鎖機(jī)制的隔離級(jí)別定義 : (來(lái)自論文 [1])
表 6. - [1]-table 2
這里有一個(gè)論文 [1]提及的結(jié)論 : Table 3與 Table 2的 4種隔離級(jí)別的定義是等價(jià)的,也就是說(shuō) Locking-based 的 4種隔離級(jí)別與 ANSI-SQL加強(qiáng)版定義的 4種隔離級(jí)別等價(jià)。
Degree-0 << any defined Isolation Level. ANSI-RU << RU == Locking-RU == Degree-1 ANSI-RC << RC == Locking-RC == Degree-2 Degree-2 << ANSI-RR << RR == Locking-RR << Degree-3 ANOMALY-SR << SR == Degree-3 |
注意 : Serializable級(jí)別是最強(qiáng)的級(jí)別,理論上該級(jí)別解決了所有的異常現(xiàn)象。
4. 最終的隔離級(jí)別關(guān)系圖 (來(lái)自論文 [1])
以 2、 3的定義 以及 (二 )中的序列模式關(guān)系為基礎(chǔ),最終我們得到了一張隔離級(jí)別關(guān)系圖 :
圖 4. - [1]-Figure 2
最底層表示最弱的隔離級(jí)別,最頂層表示最強(qiáng)的隔離級(jí)別;而中間顯示有些隔離級(jí)別之間并無(wú)絕對(duì)的強(qiáng)弱關(guān)系,因?yàn)榉謩e有各自能夠解決而對(duì)方不能保證解決的問題,這些分支主要在 RC級(jí)別與 SR(Serializable)級(jí)別之間;這里需要強(qiáng)調(diào) : 每種 DBMS實(shí)現(xiàn)的隔離級(jí)別可能會(huì)在細(xì)節(jié)表現(xiàn)上有所不同,但至少應(yīng)不弱于 ANSI-SQL標(biāo)準(zhǔn);而每家的實(shí)現(xiàn)又取決于歷史原因以及產(chǎn)品層面希望給用戶怎樣的吸引力,因此在不同數(shù)據(jù)庫(kù)產(chǎn)品之間進(jìn)行切換時(shí),存儲(chǔ)層和應(yīng)用層都需要充分考慮隔離級(jí)別對(duì)用戶的影響。
(四 ) 相關(guān)問題
Q. InnoDB - RR 隔離級(jí)別的意義何在?
A. InnoDB中隔離級(jí)別的實(shí)現(xiàn)手段有 2種,一種是 (行 )鎖機(jī)制,一種是在 MVCC機(jī)制 (需要與鎖機(jī)制結(jié)合 )。無(wú)論用戶發(fā)起的事務(wù)中的 SQL都是基于鎖并發(fā)控制的讀 /寫 SQL,還是也包含了基于 MVCC(無(wú)鎖 )的只讀 SQL,執(zhí)行結(jié)果都應(yīng)滿足該事務(wù)所處隔離級(jí)別的語(yǔ)義。
對(duì)于InnoDB-RR隔離級(jí)別,一方面,在鎖機(jī)制上采用 SS2PL策略 ( Locking Repeatable Read),理論上 (以及實(shí)際上 )已經(jīng)達(dá)到了 可串行化的隔離級(jí)別 ( Locking-Serializable = Degree 3 >> Locking Repeatable Read = ANSI-SQL Phenomenon-based Repeatable Read >> ANSI-SQL Anomaly-based Repeatable Read),已經(jīng)強(qiáng)于加強(qiáng)版 ANSI-SQL RR級(jí)別的定義了。另一方面,從現(xiàn)象上來(lái)講 InnoDB-RR的鎖機(jī)制避免了包括前述的幻讀、讀偏斜、寫偏斜現(xiàn)象,但不僅限于此,而 RC隔離級(jí)別并不能解決諸如 A5A(讀偏斜 ),A5B(寫偏斜 )等異常,因此 MySQL內(nèi)部將默認(rèn)事務(wù)隔離級(jí)別設(shè)定為 RR,還是有重要意義的。
Q. 關(guān)于 SI(快照隔離 )級(jí)別
A. 論文 [1]中有所描述,是基于 MVCC技術(shù)實(shí)現(xiàn)的隔離級(jí)別,涉及的行為序列屬于 多版本 (Multi-Versioning)行為序列,在理論上需要向 單值 (Single-Valued)行為序列做等價(jià)轉(zhuǎn)換才能夠?qū)?SI并入 圖 4.所示的隔離級(jí)別體系結(jié)構(gòu) (去做比較 )。文中涉及很多相關(guān)的分析過程,限于篇幅后續(xù)單獨(dú)再對(duì)基于 MVCC技術(shù)的隔離級(jí)別做討論。這里僅列舉一些重要的結(jié)論 ( 圖 4. ):
Degree-2 == RC << SI << SR = Degree-3 SI >><< RR |
Q. P2為何如此包容 (P2包含 A2,P4,A5A,A5B,...)?
A. 一方面, P2實(shí)際上抽象了 A2,P4,A5A,A5B等異常模式的共性—— ”先讀后寫 ”;另一方面, ”先讀后寫 ”很多時(shí)候意味著后寫的目標(biāo)數(shù)據(jù)對(duì)先讀出的數(shù)據(jù)有依賴,這里可能是同一個(gè)數(shù)據(jù)項(xiàng)的依賴,也可能是 2個(gè)或者多個(gè)數(shù)據(jù)項(xiàng)的依賴,因此會(huì)涉及 A5A,A5B等諸多可能破壞關(guān)聯(lián)約束的現(xiàn)象。
以上是筆者對(duì)事務(wù)隔離級(jí)別的粗淺理解—— 某種隔離級(jí)別定義了需要解決的某些并發(fā)操作問題的 最小 集合,謹(jǐn)為自己釋疑,由于水平有限,理解尚不完備,還有許多相關(guān)問題值得學(xué)習(xí)和討論,歡迎討論指教。
參考文獻(xiàn) :
[1] “A Critique of ANSI SQL Isolation Levels,” Proc. ACM SIGMOD 95, pp. 1-10, San Jose CA, June 1995, ? ACM
作者:賈春生(基礎(chǔ)架構(gòu)-數(shù)據(jù)庫(kù)開發(fā)組)
現(xiàn)在注冊(cè)滴滴云,有機(jī)會(huì)可得30元無(wú)門檻滴滴出行券
新購(gòu)云服務(wù)1月5折 3月4.5折 6月低至4折
滴滴云使者招募,推薦最高返傭50%
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。