隔离级别
一、概述
隔离级别是设计数据库系统的重要要求。对于事务来说,按照既定顺序一个接一个地执行,那么数据库最终一定会得到一个确定的正确的结果。然而,这样的实现对于现如今的系统来说代价太大。严格地顺序执行意味着事务之间的并发度为0,导致系统的性能不佳。
我们知道,并不是所有的系统都要求事务达到一个强的正确性的顺序,只要能够提供一个一致性的状态,可以适当降低对事务正确性的要求。因此,我们需要一个能够提供不同要求的分级标准,根据应用的需求,来设计数据库系统不同隔离级别的实现,从而在满足应用要求的同时,也能够尽可能的提高系统性能。
一个好的隔离级别的定义有两个目标:(1)正确。每个级别的定义,应该能够将所有损害该级别想要保证的正确性的情况排除在外。也就是说,只要实现满足某一隔离级别定义,就一定能获得对应的正确性保证。(2)实现无关。常见的并发控制的实现方式包括,锁、OCC以及多版本 。而一个好的标准不应该限制其实现方式。
隔离级别的定义比较复杂。最开始的时候是根据能够避免不同的异象来判定隔离等级。但是由于异象的定义存在歧义,从而出现了基于锁实现的异象的定义。但后来的证明发现,基于锁的异象太严格,且与实现方式相关,不能为OCC以及MVCC所适用。因此,提出了基于序列化图的异象定义,并给出了更多的隔离级别。
针对快照隔离,后来提出了快照可序列化的概念,又在SSI上扩展了这项工作。最终,在PG中实现了可序列化。后面,A Critique of Snapshot Isolation 指出SSI bootstrapping算法可以简化。
二、弱一致性的隔离级别[9]:首次提出
通过牺牲可串行化来提高系统性能。
(一)具体的Degree与锁对应
| Degree 0 | 短写锁 |
|---|---|
| Degree 1 | 长写锁 |
| Degree 2 | 长写锁 & 短读锁 |
| Degree 3 | 长写锁 & 长读锁 |
(二)不足
-
与实现相关:这些隔离级别的实现都是与锁的实现相关的。
-
没有考虑基于谓词的操作。
-
不支持OCC & MVCC的实现。
三、ANSI SQL标准(1992):基于异象
ANSI SQL提出了非形式化的定义,规定了每个隔离级别的某些类型的行为或者现象。一个完全可串行化的系统不允许出现所有情况,而较低的隔离级别阻止了其中的一些情况,但允许其他情况。
ANSI SQL标准定义了不同的异象,并根据不同的能够避免异象的多少来划分不同的隔离级别。
(一) 异象
(1)脏读:一个事务读到了另一个事务还没提交的中间值。


(2)不可重复读: 一个事务中连续读取同一个值时返回结果不一样(中途被其他事务更改了)。

(3)幻读:当一个事务按照条件C检索出一批数据,还未结束。另外的事务写入了一个新的满足条件C的数据,使得前一个事务检索的数据集不准确。

(二) 隔离级别
根据阻止不同的异象,划分了四种隔离级别。

(三)不足
这些定义和隔离级别虽然看起来比较清晰,与实现无关。但还是有不足。
-
正确性:缺少对于Dirty Write的排除[8]。
-
只是说明了单版本的对象,缺少对MVCC的解释。
-
ANSI SQL对异象的定义表述存在歧义[8]。

最低0.47元/天 解锁文章
1403

被折叠的 条评论
为什么被折叠?



