《A Critique of ANSI SQL Isolation Levels》論文實驗

《A Critique of ANSI SQL Isolation Levels》論文實驗

來自專欄分散式與存儲技術48 人贊了文章

1序言

《A Critique of ANSI SQL Isolation Levels》是理解資料庫隔離性的最關鍵論文之一。

論文對異常現象給出了明確的定義。依據異常現象,可以確定的劃分與比較資料庫產品的隔離級別。

主要異常現象包括:

  • 讀未提交(A1)
  • 不可重複讀(A2)
  • 幻象(A3)
  • 更新丟失(P4)
  • 幻象(A3B)
  • Write Skew(A5B)
  • Read Skew(A5A)

本文對Oracle、PostgreSQL、MySQL(InnoDB)的各個隔離級別下的異常操作進行了實驗,結果可用判斷資料庫隔離級別的差異。對於新的資料庫與中間件產品,可以採用此方法判斷其隔離級別的實際水平。

2 結果匯總與分析

Oracle Read Committed、PG Read Committed與 InnoDB Read Committed能力一致。

Oracle Serializable、PG Repeatable Read能力一致。InnoDB Repeatable Read比前兩者低。

PG Serializable與InnoDB Serializable能力一致。

3 Oracle

3.1 Oracle read committed

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:是

操作步驟:

幻象A3(出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:是

操作步驟:

更新丟失P4(出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:是

操作序列:

Read skewA5A(出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:是

操作序列:

write skewA5B(出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:是

操作序列:

幻象A3B(出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

3.2 Oracle serializable

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(不出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:否

操作步驟:

幻象A3(不出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:否

操作步驟:

更新丟失P4(不出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:不出現

操作序列:

Read skewA5A(不出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:否

操作序列:

write skewA5B(出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:是

操作序列:

幻象A3B(出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

4 PostgreSQL

4.1 pg read committed

以下會話設置隔離級別

SET SESSION CHARACTERISTICS AS TRANSACTION isolation level read committed;

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:是

操作步驟:

幻象A3(出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:是

操作步驟:

更新丟失P4(出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:是

操作序列:

Read skewA5A(出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:是

操作序列:

write skewA5B(出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:是

操作序列:

幻象A3B(出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

4.2 pg repeatable read

會話設置如下隔離級別

SET SESSION CHARACTERISTICS AS TRANSACTION isolation level repeatable read;

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(不出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:否

操作步驟:

幻象A3(不出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:否

操作步驟:

更新丟失P4(不出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:否

操作序列:

Read skewA5A(不出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:否

操作序列:

write skewA5B(出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:是

操作序列:

幻象A3B(出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

4.3 pg serializable

設置會話級別

SET SESSION CHARACTERISTICS AS TRANSACTION isolation level serializable;

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(不出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:否

操作步驟:

幻象A3(不出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:否

操作步驟:

更新丟失P4(不出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:否

操作序列:

Read skewA5A(不出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:否

操作序列:

write skewA5B(不出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:否

操作序列:

幻象A3B(不出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

5 InnoDB

5.1 InnoDB read committed

設置隔離級別

set session transaction isolation level Read committed;

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:是

操作步驟:

幻象A3(出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:是

操作步驟:

更新丟失P4(出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:是

操作序列:

Read skewA5A(出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:是

操作序列:

write skewA5B(出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:是

操作序列:

幻象A3B(出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

5.2 InnoDB repeatable read

設置會話隔離級別語句

set session transaction isolation level Repeatable read;

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(不出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:否

操作步驟:

幻象A3(不出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:否

操作步驟:

更新丟失P4(出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:是

操作序列:

Read skewA5A(不出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:否

操作序列:

write skewA5B(出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:是

操作序列:

幻象A3B(出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

InnoDB serializable

設置隔離級別

set session transaction isolation level serializable;

臟讀A1(不出現)

操作序列:

P1: w1[x]...r2[x]...(c1 or a1) and (c2 or a2) in any order

A1: w1[x]...r2[x]...(a1 and c2 in any order)

異常是否出現:否

操作步驟:

不可重複讀A2(不出現)

操作序列:

P2: r1[x]..w2[x]..(c1 or a1) and (c2 or a2) in any order

A2: r1[x]..w2[x]..c2..r1[x]..c1

異常是否出現:否

操作步驟:

幻象A3(不出現)

操作序列:

P3:r1[P]..wi[2][y in P]..(c1 or a1) and (c2 or a2) in any order

A3:r1[P]..wi[2][y in P]..c2..r1[P]..c1

異常是否出現:否

操作步驟:

更新丟失P4(不出現)

操作序列:

P4: r1[x]...w2[x]...w1[x]...c1 (Lost Update)

是否出現異常:否

操作序列:

Read skewA5A(不出現)

操作序列:

A5A: r1[x]..w2[x]..w2[ y]..c2..r1[y]...(c1 or a1)

是否出現異常:否

操作序列:

write skewA5B(不出現)

操作序列:

A5B: r1[x]...r2[y]..w1[y]..w2[x]..(c1 and c2 occur)

是否出現異常:否

操作序列:

幻象A3B(不出現)

操作序列:

b1..b2..r1[P]..w1[y in P]..r2[P]..w2[y in P]..c1..c2

是否出現異常:是

操作序列:

版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證)


推薦閱讀:

SQL每日一練【180609】
全球首個活人腦細胞資料庫公布
Nosql資料庫服務之redis
高並發下的sql優化
企名片-5.24日國內外融資事件清單(42筆)

TAG:一致性 | 資料庫 |