再谈数据库事务隔离性

写在前头

近两年分布式数据库技术加速前行,而由于金融行业技术生态的限定,周围众多同班对其并不曾深刻的摸底,所以举行高质量、高可靠系统规划时频仍不够这一利器。Ivan希望以多元作品的措施与大家互换探究,加深咱们对分布式数据库的认识。本文是该种类文章的首先篇,主要探索事务管理中的隔离性,厘清相关概念和关键技术,为前面演讲分布式数据库的事务管理做一个掩映,姑且算是一篇前传吧。


写在前边

近两年分布式数据库技术加快前行,而鉴于金融行业技能生态的限量,周围众多校友对其并从未深远的刺探,所以举行高质量、高可信系统规划时反复缺少这一利器。伊凡希望以多元小说的主意与大家沟通探究,加深大家对分布式数据库的认识。本文是该连串小说的率先篇,主要探索事务管理中的隔离性,厘清相关概念和关键技术,为后边解说分布式数据库的事务管理做一个选配,姑且算是一篇前传吧。


正文

我们率先从概念出发,事务管理包蕴原子性、一致性、隔离性和持久性三个方面,即ACID。所有数据库专著都会付给那几个几天个性的定义,本文我们引用了吉米格雷对其的概念。

Jim格雷是事务处理方面的师父,本文中广大情节都源于她的专著和诗歌。为幸免翻译引入的歧义,那里大家一贯引用原文。

Atomicity: Either all the changes from the transaction occur
(writes, and messages sent), or none occur.

Consistency: The transaction preserves the integrity of stored
information.

Isolation: Concurrently executing transactions see the stored
information as if they were running serially (one after another).

Durability: Once a transaction commits, the changes it made
(writes and messages sent) survive any system failures.

在上述隔离性(Isolation)的定义中,大家得以窥见其目标是使并发事务的实施职能与串行一致,但在切实可行技术完结上往往须求在现身能力和串行化效果之间举办平衡,很难两者兼顾。平衡的结果就是会冒出违背串行效果的光景即分外现象(Phenomenon)。常常来说,隔离级其他晋级伴随着出现能力的减退,两者负相关。种种数据库在谈到隔离级别时都会引用ANSI
SQL-92标准隔离级别,大家来探望它的具体内容。

正文

大家率先从概念出发,事务管理包含原子性、一致性、隔离性和持久性八个方面,即ACID。所有数据库专著都会付给这些两个特征的定义,本文我们引用了吉姆格雷对其的概念。

Jim格雷是事务处理方面的法师,本文中诸多故事情节都来自他的专著和杂谈。为幸免翻译引入的歧义,那里大家一贯引用原文。

Atomicity: Either all the changes from the transaction occur
(writes, and messages sent), or none occur.

Consistency: The transaction preserves the integrity of stored
information.

Isolation: Concurrently executing transactions see the stored
information as if they were running serially (one after another).

Durability: Once a transaction commits, the changes it made
(writes and messages sent) survive any system failures.

在上述隔离性(Isolation)的定义中,大家可以发现其目的是使并发事务的推行效果与串行一致,但在实际技术达成上屡次需求在产出能力和串行化效果之间展开平衡,很难两者兼顾。平衡的结果就是会见世违反串行效果的现象即相当现象(Phenomenon)。平时来说,隔离级其余升迁伴随着出新能力的下降,两者负相关。各样数据库在谈到隔离级别时都会引用ANSI
SQL-92标准隔离级别,大家来探望它的具体内容。

ANSI SQL-92 Isolation Levels

ANSI
SQL-92只怕是最早指出了依据至极现象来定义隔离级其余点子,同时没有将割裂级别与实际得以达成机制绑定,隔离的兑现能够依照锁(lock-based)大概无锁(lock-free),包容了两次三番的技艺提升。该标准依据三种极度现象将隔离性定义为八个级别,具体如下。

图片 1

脏读,事务(T1)中修改的数量项在尚未提交的景况下被其余事情(T2)读取到,而T1举办Rollback操作,则T2刚刚读取到的数码并从未实际存在。
不足重复读,T1读取数据项,T2对内部的数额举行了修改或删除且Commit成功。假如T1尝试再度读取那个多少,会拿到T2修改后的多寡依然发现数目已去除。这样T1在一个事情中一遍同样条件的读取,且结果集内容改动或结果集数量裁减。
幻读,T1使用一定的询问条件拿到一个结出集,T2插入新的数目且这一个数量符合T2刚刚操作的询问条件。T2
commit 成功后,T1再一次实施同样的查询,此时到手的结果集增大。

许多篇章都构成数据库产品对上述格外现象的实例和拍卖体制举办了验证,本文中不再赘述,有趣味的校友可以参见文末的链接[1]。

ANSI
SQL-92标准早在92年公布,但不管当时可能后来都并未被各大数据库厂商严谨依据,部分缘故恐怕是明媒正娶过于简化与事实上行使有自然程度的脱离。吉姆格雷等人在1995揭破了舆论“A Critique of ANSI SQL Isolation Levels”
(本文中简称为Critique[2])对隔断级别进行更健全的论述,可以辅助大家深化精晓。

ANSI SQL-92 Isolation Levels

ANSI
SQL-92可能是最早指出了依照非凡现象来定义隔离级其他方法,同时没有将切断级别与具象贯彻机制绑定,隔离的达成可以依据锁(lock-based)或然无锁(lock-free),兼容了继承的技巧升高。该标准依据三种万分现象将隔离性定义为两个级别,具体如下。

图片 2

脏读,事务(T1)中修改的数量项在没有提交的情况下被其余业务(T2)读取到,而T1举行Rollback操作,则T2刚刚读取到的数码并不曾实际存在。
不行重复读,T1读取数据项,T2对里面的数额开展了改动或删除且Commit成功。如果T1尝试再度读取那几个多少,会得到T2修改后的多寡照旧发现数目已删除。那样T1在一个工作中一回同样条件的读取,且结果集内容变更或结果集数量减小。
幻读,T1使用一定的询问条件获得一个结出集,T2插入新的数目且那几个数量符合T2刚刚操作的查询条件。T2
commit 成功后,T1再度实施同一的询问,此时到手的结果集增大。

很多篇章都构成数据库产品对上述非常现象的实例和处理机制进行了印证,本文中不再赘言,有趣味的同桌可以参照文末的链接[1]。

ANSI
SQL-92标准早在92年发布,但不论当时如故后来都尚未被各大数据库厂商严苛依据,部分缘由想必是业内过于简化与事实上采纳有必然水平的退出。吉姆格雷等人在1995发布了诗歌“A Critique of ANSI SQL Isolation Levels”
(本文中简称为Critique[2])对隔断级别举行更完善的论述,可以支持大家深化驾驭。

Critique Isolation Levels

Critique指出了ANSI
SQL-92存在的五个难点,首先是自然语言方式界定的非常现象并不严俊导致部分同质化的非凡现象被遗漏;其次是有些优良的非常现象并不曾被含有进去,导致隔离级别存在鲜明缺欠。由此,文中对ANSI
SQL-92的二种万分现象(将其编号为A1/A2/A3)举行了扩展(编号为P1/P2/P3),并追加了其余5种普遍的卓殊现象。受限于篇幅,那里仅对三种相当现象进行认证。

Critique Isolation Levels

Critique提出了ANSI
SQL-92存在的五个难题,首先是自然语言形式界定的格外现象并不严酷导致部分同质化的卓殊现象被遗漏;其次是一些超级的十分现象并从未被含有进去,导致隔离级别存在分明缺欠。因而,文中对ANSI
SQL-92的二种很是现象(将其编号为A1/A2/A3)进行了增加(编号为P1/P2/P3),并追加了此外5种常见的卓殊现象。受限于篇幅,那里仅对三种很是现象举行认证。

Lost Update

丢掉更新(Lost
Update)是一个经文的数据库难点,由于太过重大所有主流数据库都化解了该难点,大家那里将操作稍加变形来比喻。

笔者们运用MySQL举办出现说法,创造表并先河化数据

create table account (balance int,name varchar(20)) ENGINE=InnoDB;
insert into account values(50,'Tom');
T1 T2
begin; begin;
select balance into @bal from account where name='Tom'
——————–
@bal = 50
select balance into @bal from account where name='Tom'
——————-
@bal = 50
update account set balance = @bal -40 where name = ‘Tom’;
commit;
update account set balance = @bal - 1 where name = ‘Tom’;
commit;

在上述操作中T1、T2串行执行作用是对余额举办三次扣减,分别为40和1,最后值为9,但相互的终极值为49,T2的改动被丢掉。大家得以发现Lost
update的真相是T1事务读取数据,而后该数额被T2事务修改并付诸,T1基于已经过期的数额进行了双重修改,造成T2的改动被遮住。

Lost Update

丢掉更新(Lost
Update)是一个经文的数据库难题,由于太过重大所有主流数据库都化解了该难题,大家那里将操作稍加变形来比喻。

我们运用MySQL进行出现说法,创设表并初始化数据

create table account (balance int,name varchar(20)) ENGINE=InnoDB;
insert into account values(50,'Tom');
T1 T2
begin; begin;
select balance into @bal from account where name='Tom'
——————–
@bal = 50
select balance into @bal from account where name='Tom'
——————-
@bal = 50
update account set balance = @bal -40 where name = ‘Tom’;
commit;
update account set balance = @bal - 1 where name = ‘Tom’;
commit;

在上述操作中T1、T2串行执行听从是对余额进行三回扣减,分别为40和1,最后值为9,但互动的末尾值为49,T2的改动被丢掉。我们得以窥见Lost
update的实质是T1事务读取数据,而后该数据被T2事务修改并交由,T1基于已经过期的数目举办了再一次修改,造成T2的改动被掩盖。

Read Skew

读偏序(Read
Skew)是汉兰达C级蒙受的标题。如若数额项x与y存在一致性约束,T1先对读x,而后T2修改x和y后commit,此时T1再读y。T1收获的x与y不满意原有的一致性约束。

MySQL暗中认同隔离级别为Escort中华V,大家须求手工安装为PRADOC并起初化数据

set session transaction isolation level read committed;
insert into account values(70,'Tom');
insert into account values(30,'Kevin');
T1 T2
begin; begin;
select * from account where name=’Tom’;
———————
balance name
70 Tom
select * from account where name=’Tom’;
———————
balance name
70 Tom
update account set balance = balance - 30 where name='Tom';
update account set balance = balance + 30 where name=’Kevin’;
commit;
select * from account where name='Kevin';
———————
balance name
60 Kevin
commit;

初叶数据汤姆与凯文的账户合计为100,在T1事务内的三回读取拿到账户合计为130,鲜明不切合从前的一致性约束。

填补这么些分外现象后,Critique给出了新的矩阵,比较ANSI特别健全也更贴合真实的数据库产品。

图片 3

主流数据库考虑到串行化效果与出新质量的平衡,一般暗许隔离级别都在于QX56C与牧马人讴歌RDX之间,部分提供了Serializable。尤其提醒,无论ASNI
SQL-92如故Critique的隔断级别都无法确保直接照射到骨子里数据库的同名隔离级别。

Read Skew

读偏序(Read
Skew)是奥迪Q3C级遭逢的标题。如果数额项x与y存在一致性约束,T1先对读x,而后T2修改x和y后commit,此时T1再读y。T1到手的x与y不满意原有的一致性约束。

MySQL暗中同意隔离级别为奥迪Q3Odyssey,大家必要手工安装为途达C并发轫化数据

set session transaction isolation level read committed;
insert into account values(70,'Tom');
insert into account values(30,'Kevin');
T1 T2
begin; begin;
select * from account where name=’Tom’;
———————
balance name
70 Tom
select * from account where name=’Tom’;
———————
balance name
70 Tom
update account set balance = balance - 30 where name='Tom';
update account set balance = balance + 30 where name=’Kevin’;
commit;
select * from account where name='Kevin';
———————
balance name
60 Kevin
commit;

初步数据汤姆与凯文的账户合计为100,在T1事务内的三遍读取拿到账户合计为130,分明不合乎之前的一致性约束。

补给这几个非凡现象后,Critique给出了新的矩阵,相比较ANSI越发完善也更贴合真实的数据库产品。

图片 4

主流数据库考虑到串行化效果与产出质量的平衡,一般暗许隔离级别都在于卡宴C与翼虎PRADO之间,部分提供了Serializable。尤其提醒,无论ASNI
SQL-92依然Critique的隔离级别都无法担保直接照射到实在数据库的同名隔离级别。

SI&MVCC

快照隔离(SI,Snapshot
Isolation)是座谈隔离性时周边的术语,可以做二种的解读,一是现实性的割裂级别,SQL
Server、CockroachDB都一向定义了那几个隔离级别;二是一种隔离机制用来落到实处相应的隔离级别,在Oracle、MySQL
InnoDB、PostgreSQL等主流数据库中普遍使用。多版本出现控制(MVCC,multiversion
concurrency
control)是透过记录数据项历史版本的主意进步系统应对多事务访问的出现处理能力,例如幸免单值(Single-Valued)存储景况下写操作对读操作的锁排斥。MVCC和锁都以SI的关键落成手段,当然也存在无锁的SI完毕。以下是Critique描述的SI运作进度。

作业(记为T1)初始的一念之差会获取一个日子戳Start
Timestamp(记为ST),而数据库内的装有数据项的每一个历史版本都记录着相应的光阴戳Commit
Timestamp(记为CT)。T1读取的快照由所有数据项版本中那么些CT小于ST且近来的历史版本构成,由于那么些数量项内容只是历史版本不会再也被写操作锁定,所以不会爆发读写争辩,快照内的读操作永远不会被封堵。其他业务在ST之后的改动,T1不可知。当T1
commit的一刹这会取得一个CT,并确保大于此刻数据库中已存在的随意时间戳(ST或CT),持久化时会将那一个CT将作为数据项的本猪时间戳。T1的写操作也反映在T1的快照中,可以被T1内的读操作再度读取。当T1
commit后,修改会对那个具有ST大于T1 CT的事情可知。
假使存在其余业务(T2),其CT在T1的周转区间【ST,CT】之间,与T1对相同的数量项举行写操作,则T1
abort,T2
commit成功,这几个特点被称呼First-committer-wins,可以保险不出现Lost
update。事实上,部分数据库会将其调整为First-write-wins,将争论判断提前到write操作时,缩短顶牛的代价。

这几个进程不是某个数据库的切切实实贯彻,事实上不一样数据库对于SI达成存在很大差异。例如,PostgreSQL会将历史版本和脚下版本一起保存通过时间戳区分,而MySQL和Oracle都在回滚段中保留历史版本。MySQL的奥迪Q5C与奥迪Q7RAV4级别均运用了SI,就算当前工作(T1)读操作的多寡被其余工作的写操作加锁,T1转向回滚段读取快照数据,幸免读操作被封堵。但是LANDC的快照定义与以上描述不同,也席卷了T1执行进度中任何事情提交的新星版本[6]。

此外,大家还有一个第一发现,时间戳是生成SI的要紧因素。在单机系统中,唯一时间戳相比易于达成,而对于分布式系统在跨节点、跨数据主旨照旧跨城市安排的境况下如何树立一个唯一时钟就成为一个极度复杂的题材,大家暂留下一个伏笔将在前面的专题小说中展开探讨。

SI&MVCC

快照隔离(SI,Snapshot
Isolation)是座谈隔离性时周边的术语,可以做二种的解读,一是有血有肉的隔断级别,SQL
Server、CockroachDB都一向定义了这些隔离级别;二是一种隔离机制用来落到实处相应的隔断级别,在Oracle、MySQL
InnoDB、PostgreSQL等主流数据库中普遍利用。多版本出现控制(MVCC,multiversion
concurrency
control)是经过记录数据项历史版本的不二法门进步系统回答多事务访问的面世处理能力,例如防止单值(Single-Valued)存储意况下写操作对读操作的锁排斥。MVCC和锁都以SI的最首要完结手段,当然也存在无锁的SI完成。以下是Critique描述的SI运作进程。

作业(记为T1)先导的弹指间会得到一个时光戳Start
Timestamp(记为ST),而数据库内的具有数据项的每一种历史版本都记录着相应的时光戳Commit
Timestamp(记为CT)。T1读取的快照由具有数据项版本中这一个CT小于ST且近期的历史版本构成,由于那些多少项内容只是野史版本不会重新被写操作锁定,所以不会发生读写争辨,快照内的读操作永远不会被封堵。其余业务在ST之后的改动,T1不可知。当T1
commit的弹指间会赢得一个CT,并保管大于此刻数据库中已存在的任性时间戳(ST或CT),持久化时会将那些CT将作为数据项的本辰时间戳。T1的写操作也反映在T1的快照中,可以被T1内的读操作再度读取。当T1
commit后,修改会对那么些负有ST大于T1 CT的政工可见。
若果存在其余业务(T2),其CT在T1的周转区间【ST,CT】之间,与T1对同样的数码项进行写操作,则T1
abort,T2
commit成功,那脾脾性被称之为First-committer-wins,可以保险不出现Lost
update。事实上,部分数据库会将其调整为First-write-wins,将争执判断提前到write操作时,减弱争执的代价。

这一个进程不是某个数据库的切实可行落实,事实上差别数据库对于SI完毕存在很大差别。例如,PostgreSQL会将历史版本和脚下版本一起保存通过时间戳区分,而MySQL和Oracle都在回滚段中保存历史版本。MySQL的奥迪Q7C与卡宴奔驰G级级别均采取了SI,假若当前事情(T1)读操作的数量被别的事情的写操作加锁,T1转向回滚段读取快照数据,防止读操作被堵塞。可是MuranoC的快照定义与上述描述分化,也包蕴了T1执行进程中任何业务提交的风靡版本[6]。

其余,我们还有一个重大发现,时间戳是生成SI的重中之重因素。在单机系统中,唯一时间戳相比较不难完毕,而对此分布式系统在跨节点、跨数据基本依旧跨城市计划的情景下什么树立一个唯一时钟就改为一个格外复杂的标题,大家暂留下一个伏笔将在前边的专题小说中展开座谈。

Serializable VS SSI

SI是这么有效,甚至在TPC-C
benchmark测试中也从未出现其余卓殊现象[5],但实则SI不可以担保完全的串行化效果。Critique中提出,SI还无法处理A5B(Write
Skew,写偏序),如下图所示。

图片 5

Serializable VS SSI

SI是如此有效,甚至在TPC-C
benchmark测试中也未曾出现其它万分现象[5],但实在SI不或许担保总体的串行化效果。Critique中提议,SI还不只怕处理A5B(Write
Skew,写偏序),如下图所示。

图片 6

Write Skew

写偏序(Write
Skew)也是一致性约束下的相当现象,即七个相互事务都基于本人读到的数额集去覆盖另一局地数据集,在串行化境况下八个工作不管何种先后顺序,最后将高达同等状态,但SI隔离级别下无法落到实处。下图的“黑白球”经常被用来表达写偏序难点。

图片 7

怎么兑现真正的串行化效果啊?事实上,早期的数据库已经经过从严两阶段锁协议(S2PL,Strict
Two-Phase Locking)完毕了完全的串行化隔离(Serializable
Isolation),即正在举办读操作的数据阻塞对应写操作,写操作阻塞所有操作(包蕴读操作和写操作)。如阻塞导致循环将结合死锁,则需求开展rollback操作。S2PL的问题肯定,在竞争可以场地下,阻塞和死锁会造成数据库吞吐量下跌和响应时间的充实,所以那种串行化不可以使用于实际生育条件。直到SSI的出现,人们终于找到具有实际价值的串行化隔离方案。

串行化快照隔离(SSI, Serializable Snapshot
Isolation,也会被翻译为连串化快照)是根据SI革新达到Serializable级其他隔离性。SSI由迈克尔James Cahill在他的舆论”Serializable Isolation for Snapshot
Databases”[3]中提议(该诗歌得到2008 Sigmod Best Paper
Award,小说最后提供了该散文的二零零六年完整版[4]连带音讯,有趣味的同窗可以深深切磋)。SSI保留了SI的众多独到之处,尤其是读不打断任何操作,写不会卡住读。事务如故在快照中运作,但扩张了对业务间读写争执的督察用于识别事务图(transaction
graph)中的危险结构。当一组并发事务只怕暴发很是现象(anomaly),系统将经过回滚其中一些事情进行干涉以清除anomaly发生的只怕。这么些进度即使会造成某些事情的荒唐回滚(不会导致anomaly的事情被误杀),但可以确保化解anomaly[3]。

从理论模型看,SSI品质接近SI,远远好于S2PL。二零一二年,PostgreSQL在9.1本子中贯彻了SSI[7],恐怕也是第三个协理SSI的小购买销售数据库,验证了SSI的达成效益。CockroachDB也从Cahill的舆论拿到灵感,达成SSI并将其当作其默许隔离级别。

乘机技术的进化,SI/SSI已经变成主流数据库的隔离技术,越发是后人的出现,无需开发人士在代码通过显式锁来幸免卓殊,从而下降了人为不当的票房价值。在分布式数据库的相关章节中,我们将更为对SSI完毕机制举办深刻商讨。


参考文献
[1]Innodb中的事务隔离级别和锁的关联,ameng,https://tech.meituan.com/innodb-lock.html
[2]H. Berenson, P. Bernstein, J. Gray, J.Melton, E. O’Neil,and P.
O’Neil. A critique of ANSI SQL isolation levels. InProceedings of the
SIGMOD International Conference on Management of Data, pages1–10, May

  1. [3]Michael J. Cahill, Uwe Röhm, and Alan D.Fekete. 2008. Serializable
    isolation for snapshot databases. In SIGMOD ’08:Proceedings of the 2008
    ACM SIGMOD international conference on Management of data, pages
    729–738, New York, NY, USA. ACM.
    [4]Michael James Cahill. 2009. Serializable Isolation for Snapshot
    Databases. Sydney Digital Theses. University of Sydney, School of
    Information Technologies
    [5] A. Fekete, D. Liarokapis, E. O’Neil, P.O’Neil, andD. Shasha.
    Making snapshot isolation serializable. In ACM transactions on database
    systems, volume 39(2), pages 492–528, June 2005.
    [6]姜承尧,MySQL技术内幕:InnoDB存储引擎机, 械工业出版社, 2011
    [7]https://wiki.postgresql.org/wiki/Serializable
Write Skew

写偏序(Write
Skew)也是一致性约束下的分外现象,即三个相互事务都基于自身读到的数量集去覆盖另一部分数据集,在串行化情状下多个工作不管何种先后顺序,最后将达到同等状态,但SI隔离级别下不可以落到实处。下图的“黑白球”平常被用来证实写偏序难题。

图片 8

何以贯彻真正的串行化效果呢?事实上,早期的数据库已经通过严谨两等级锁协议(S2PL,Strict
Two-Phase Locking)达成了截然的串行化隔离(Serializable
Isolation),即正在举行读操作的数目阻塞对应写操作,写操作阻塞所有操作(包蕴读操作和写操作)。如阻塞导致循环将结合死锁,则需求展开rollback操作。S2PL的题材同理可得,在竞争剧烈地方下,阻塞和死锁会造成数据库吞吐量下跌和响应时间的充实,所以那种串行化无法选拔于实际生育环境。直到SSI的产出,人们终于找到具有实际价值的串行化隔离方案。

串行化快照隔离(SSI, Serializable Snapshot
Isolation,也会被翻译为体系化快照)是根据SI革新达到Serializable级其余隔离性。SSI由迈克尔詹姆士 Cahill在她的诗歌”Serializable Isolation for Snapshot
Databases”[3]中提议(该散文拿到2008 Sigmod Best Paper
Award,文章最终提供了该故事集的二零零六年总体版[4]连锁新闻,有趣味的校友可以长远钻研)。SSI保留了SI的浩大独到之处,尤其是读不封堵任何操作,写不会卡住读。事务依旧在快照中运作,但净增了对事情间读写顶牛的监察用于识别事务图(transaction
graph)中的危险结构。当一组并发事务只怕发生卓殊现象(anomaly),系统将透过回滚其中一些事情举行干预以消弭anomaly暴发的恐怕。这几个进程即便会导致一些事情的荒谬回滚(不会招致anomaly的政工被误杀),但足以保证解决anomaly[3]。

从理论模型看,SSI质量接近SI,远远好于S2PL。二零一二年,PostgreSQL在9.1版本中贯彻了SSI[7],或许也是第一个接济SSI的买卖数据库,验证了SSI的兑现效益。CockroachDB也从Cahill的舆论拿到灵感,已毕SSI并将其用作其默许隔离级别。

乘势技术的升华,SI/SSI已经改成主流数据库的隔断技术,尤其是接班人的面世,无需开发人士在代码通过显式锁来避免十分,从而下跌了人为不当的可能率。在分布式数据库的连带章节中,我们将越是对SSI已毕机制进行深刻研商。


参考文献
[1]Innodb中的事务隔离级别和锁的关联,ameng,https://tech.meituan.com/innodb-lock.html
[2]H. Berenson, P. Bernstein, J. Gray, J.Melton, E. O’Neil,and P.
O’Neil. A critique of ANSI SQL isolation levels. InProceedings of the
SIGMOD International Conference on Management of Data, pages1–10, May

  1. [3]Michael J. Cahill, Uwe Röhm, and Alan D.Fekete. 2008. Serializable
    isolation for snapshot databases. In SIGMOD ’08:Proceedings of the 2008
    ACM SIGMOD international conference on Management of data, pages
    729–738, New York, NY, USA. ACM.
    [4]Michael James Cahill. 2009. Serializable Isolation for Snapshot
    Databases. Sydney Digital Theses. University of Sydney, School of
    Information Technologies
    [5] A. Fekete, D. Liarokapis, E. O’Neil, P.O’Neil, andD. Shasha.
    Making snapshot isolation serializable. In ACM transactions on database
    systems, volume 39(2), pages 492–528, June 2005.
    [6]姜承尧,MySQL技术内幕:InnoDB存储引擎机, 械工业出版社, 2011
    [7]https://wiki.postgresql.org/wiki/Serializable

相关文章