数据库隔离级别

本节主要介绍了ANSI SQL隔离级别的定义、不足以及其他隔离级别如Cursor Stability、SI等。

隔离级别的定义

Serializability相关概念

transaction事务:聚合一系列操作(Action)的集合,把数据库从一个一致性状态转换到另外一个一致性状态。
history运行历史:把一系列交叉执行的事务集重整为这些事务所有操作集的线性顺序排列,比如对特定Data Item(数据项)的读写操作(如插入、删除、更新等)。
Data Item数据项: 这是一个广义的概念,可能是一个元组、一个页面甚至是整个关系。
conflict冲突:history中如果存在不同的事务在同一个Data Item上执行操作,其中一个是写操作,这种现象我们称为冲突。冲突可发生在一组由predicate lock覆盖的Data Item上面。
dependency graph:一个特定的history产生了依赖图,该依赖图定义了事务之间按时间顺序流动的数据流。已提交事务的操作在图中以节点显示,如果操作op1与op2冲突,则op1和op2两个节点存在一条由op1指向op2的有向边(op1在op2之前)。
equivalent等价性:如果不同的history有相同的事务以及相同的依赖图,那么我们说这些history是等价的。
serial history:我们说history是可串行化的,当且仅当该historyserial history是等价的。

形式化语言

读写操作
w1[x],r2[y]
其中w和r分别表示写和读,1和2分别表示事务T1和T2,x和y表示Data Item。

事务操作
c1,a2
c表示commit提交,c1表示事务T1提交
a表示abort回滚,a2表示事务T2回滚

谓词
r1[P],w2[P]
表示事务T1读满足谓词P的结果集和事务T2写满足谓词P的结果集。

ANSI SQL隔离级别

ANSI SQL隔离级别通过Phenomena现象定义(除此之外还可以通过锁、数据流图定义):
P1(Dirty Read,脏读):T1更新了数据,T2读到了该数据。
形式化语言表示:P1-->w1[x]...r2[x]...(a1 & c2 in either order)
A1-->w1[x]...r2[x]...((c1 or a1) and (c2 or a2) in any order)
P2(Non-repeatable/Fuzzy Read,脏读):T2更新/删除数据,T1无法重复读。
形式化语言表示:P2-->r1[x]...w2[x]...c2...r1[x]...c1/
A2-->r1[x]...w2[x]...((c1 or a1) and (c2 or a2) any order)
P3(Phantom Read,幻读):T2插入/删除满足谓词P的数据,T1重新执行读,结果不同
形式化语言表示:P3-->r1[P]...w2[y in P]...c2...r1[P]...c1
A3-->r1[P]...w2[y in P]...((c1 or a1) and (c2 or a2) any order)

锁(locking)

2PL两阶段锁:两个阶段,获取锁和释放锁,获取锁期间不释放锁,释放锁期间不获取锁。
读锁:Share locks
写锁:Exclusive locks
长期锁:持有直至事务结束(提交或回滚)
短期锁:持有至操作结束

通过锁来定义隔离级别:

隔离级别 读锁 写锁
Degree 0 不需要 不需要
Degree 1 = Read Uncommitted 不需要 长期写锁
Degree 2 = Read Commmitted 短期读锁 长期写锁
Cursor Stability 1.当前游标上的读锁 2.短期读谓词锁 长期写锁
Repeatable Read 1.长期Data Item读锁 2.短期读谓词锁 长期写锁
Degree 3 = Serializable 长期读锁 长期写锁

ANSI隔离级别分析

P0(Dirty Write,脏写):T1更新了data item,T2在T1提交或回滚前更新了相同的data item
形式化语言表示:w1[x]...w2[x]...c2...a1...

P1
H1: r1[x=50]w1[x=10]r2[x=10]r2[y=50]c2 r1[y=50]w1[y=90]c1
H1没有违反P1/P2/P3

P1的正确定义:
P1: w1[x]...r2[x]...((c1 or a1) and (c2 or a2) in any order)

P3
H3: r1[P] w2[insert y to P] r2[z] w2[z] c2 r1[z] c1
H3没有违反P3,但违反了业务约束
使用宽泛定义
P3: r1[P]...w2[y in P]...((c1 or a1) and (c2 or a2) any order)

重新定义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)

其他隔离级别

Cursor Stability

Cursor Stability隔离级别用于阻止Lost Update现象。
P4(Lost Update):T1读取了某个data item,接着T2更新了该data item,然后T1更新了data item并提交事务
形式化语言定义:r1[x]...w2[x]...w1[x]...c1
例如:
H4: r1[x=100] r2[x=100] w2[x=120] c2 w1[x=130] c1
在H4中,就算T2提交了,T2的更新也会丢失(T1,增加30,T2增加20,最终结果只是T1增加30,T2的更新丢失)。
禁止P2可以禁止P4,原因是w2[x]在r1[x]之后c1之前,w1[x]时会发现x已经变化(出现不可重复读现象),因此P4可用于区分Read Committed和Repeatable Read。

Cursor Stability隔离级别扩展了读已提交级别,从游标FETCH数据时增加了读动作并且在游标的当前位置(ITEM)上加锁,该锁一直持有直至游标移动或者关闭。
通常来说,从游标提取数据时可能会更新行,在这种情况下会持有锁直至事务提交(即使游标移动也是如此)。
在此隔离级别下,以下现象被禁止:
P4C: rc1[x]...w2[x]...w1[x]...c1 (Lost Update)
其中rc表示read cursor(读游标),相应的wc表示write cursor(写游标)。

显然:
READ COMMITTED « Cursor Stability « REPEATABLE READ

Snapshot Isolation

First-committer-wins先提交者胜:Start(T1)表示事务T1的开始时间,Commit(T1)表示事务T1的提交时间,
如果T1在提交的时候发现在[Start(T1),Commit(T1)]这个时间段内其他事务如T2的写数据集与T1的有交集,则T1会回滚。
形式化语言来表示:[Start(T1),Commit(T1)]∩[Start(T2),Commit(T2)] ≠ ∅,且wset(T1)∩wset(T2) ≠ ∅,如果T2已提交,则T1必须回滚。

单版本的history转换为多版本:
H1.SI: r1[x0=50] w1[x1=10] r2[x0=50] r2[y0=50] c2 r1[y0=50] w1[y1=90] c1
等价于
H1.SI.SV: r1[x=50] r1[y=50] r2[x=50] r2[y=50] c2 w1[x=10] w1[y=90] c1

SI不能保证非可串行化,比如下面的history
业务约束是x + y > 0,但H5的结果是x + y < 0
H5: r1[x=50] r1[y=50] r2[x=50] r2[y=50] w1[y=-40] w2[x=-40] c1 c2
其依赖关系是T1--->T2--->T1

A5A Read Skew:r1[x]...w2[x]...w2[y]...c2...r1[y]...(c1 or a1)
T1读到了T2写入的y的新值,而x是旧值

A5B Write Skew:r1[x]...r2[y]...w1[y]...w2[x]...(c1 and c2 occur)
x和y之间满足某种业务约束,上述操作后可能会导致违反约束。

禁止P2可以避免A5A和A5B,因此A5A和A5B仅可用于区分可重复读隔离级别以下的级别。

从强度来看,SI比读已提交要隔离等级要高,READ COMMITTED « Snapshot Isolation,原因是SI可禁止P0、P1和A5A,而读已提交只能禁止P0和P1而不能禁止A5A。

小结

隔离级别汇总(通过禁止的异象描述):

隔离级别 P0 Dirty Write P1 Dirty Read P4C Cursor Lost Update P4 Lost Update P2 Fuzzy Read P3 Phantom A5A Read Skew A5B Write Skew
Read Uncommitted Not Possible Possible Possible Possible Possible Possible Possible Possible
Read Committed Not Possible Not Possible Possible Possible Possible Possible Possible Possible
Cursor Stability Not Possible Not Possible Not Possible Sometimes Possible Sometimes Possible Possible Possible Sometimes Possible
Repeatable Read Not Possible Not Possible Not Possible Not Possible Possible Not Possible Not Possible
Snapshot Not Possible Not Possible Not Possible Not Possible Not Possible Sometimes Possible Not Possible Possible
ANSI SQL Serializable Not Possible Not Possible Not Possible Not Possible Not Possible Not Possible Not Possible Not Possible

参考资料

A Critique of ANSI SQL Isolation Levels

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容

  • 本篇文章主要介绍数据库的四大特性ACID,以及说明一下数据库的隔离级别。 如果想要说明一个数据库或者一个框架支持事...
    步积阅读 15,532评论 1 16
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,523评论 16 22
  • 创业是很多人的梦想,多少人为了理想和不甘选择了创业来实现自我价值,我就是其中一个。 创业后,我由女人变成了超人,什...
    亦宝宝阅读 1,810评论 4 1
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,564评论 0 11
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,727评论 1 1