事务隔离级别的历史

隔离级别

一、概述

隔离级别是设计数据库系统的重要要求。对于事务来说,按照既定顺序一个接一个地执行,那么数据库最终一定会得到一个确定的正确的结果。然而,这样的实现对于现如今的系统来说代价太大。严格地顺序执行意味着事务之间的并发度为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 长写锁 & 长读锁

(二)不足

  1. 与实现相关:这些隔离级别的实现都是与锁的实现相关的。

  2. 没有考虑基于谓词的操作。

  3. 不支持OCC & MVCC的实现。

三、ANSI SQL标准(1992):基于异象

ANSI SQL提出了非形式化的定义,规定了每个隔离级别的某些类型的行为或者现象。一个完全可串行化的系统不允许出现所有情况,而较低的隔离级别阻止了其中的一些情况,但允许其他情况。

ANSI SQL标准定义了不同的异象,并根据不同的能够避免异象的多少来划分不同的隔离级别。

(一) 异象

(1)脏读:一个事务读到了另一个事务还没提交的中间值。

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

(二) 隔离级别

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

在这里插入图片描述

(三)不足

这些定义和隔离级别虽然看起来比较清晰,与实现无关。但还是有不足。

  1. 正确性:缺少对于Dirty Write的排除[8]。

  2. 只是说明了单版本的对象,缺少对MVCC的解释。

  3. ANSI SQL对异象的定义表述存在歧义[8]。

三、A Critique of ANSI(1995)[8]:基于锁

(一) ANSI中的两种

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值