拖欠专业根据三种植异常现象将隔离性定义也四个级别。该规范根据三种异常现象将隔离性定义也四单级别。

形容以前边

走近两年分布式数据库技术加快前进,而由金融行业技术生态之克,周围多同室对该并无深入之摸底,所以进行大性能、高可靠系统规划时一再不够这一利器。Ivan希望为多重文章的法以及大家交流探讨,加深我们对分布式数据库的认识。本文是该系列文章的首先首,主要探索事务管理中的隔离性,厘清相关概念与关键技术,为后面阐述分布式数据库的事务管理做一个搭配,姑且算是一首前污染吧。


描绘于前头

即两年分布式数据库技术加快前行,而由于金融行业技术生态之界定,周围多同班对其并不曾尖锐之了解,所以进行大性能、高可靠系统规划时屡屡少这一利器。Ivan希望为多元文章的不二法门同大家交流探讨,加深我们对分布式数据库的认。本文是该系列文章的首先篇,主要探索事务管理中之隔离性,厘清相关概念和关键技术,为后面阐述分布式数据库的事务管理做一个掩映,姑且算是一首前污染吧。


正文

咱首先由概念出发,事务管理包括原子性、一致性、隔离性和持久性四只地方,即ACID。所有数据库专著都见面被起这个四独特点的概念,本文我们引用了Jim
Gray对其的概念。

Jim
Gray是事务处理方面的大师傅,本文中诸多情节还出自外的专著及舆论。为免翻译引入的歧义,这里我们一直引用原文。

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
Gray对该的定义。

Jim
Gray是事务处理方面的活佛,本文中众情节还源于外的专著及舆论。为避免翻译引入的歧义,这里我们直接引用原文。

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年发表,但随便即要新兴且不曾受各大数据库厂商严格遵照,部分缘故可能是明媒正娶过于简化和事实上应用来早晚水平的脱离。Jim
Gray等人于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年公布,但无论是即或者后来都并未于诸大数据库厂商严格按,部分缘由想必是正统过于简化和事实上采用来自然程度的离。Jim
Gray等人口以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)是RC级遇到的题材。如果数额项x与y存在一致性约束,T1预对读x,而后T2修改x和y后commit,此时T1再念y。T1获得的x与y不满足原有的一致性约束。

MySQL默认隔离级别也RR,我们需要手工安装也RC并初始化数据

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;

初步数据Tom与Kevin的账户合计为100,在T1事务内的简单糟糕读取得到账户合计为130,显然不称之前的一致性约束。

加这些异常现象后,Critique给来了新的矩阵,相比ANSI更加周到与否再度贴合真实的数据库产品。

图片 3

主流数据库考虑到离谱行化效果和出新性能的平衡,一般默认隔离级别都在RC与RR之间,部分提供了Serializable。特别提示,无论ASNI
SQL-92还是Critique的割裂级别都非克担保直接照射到骨子里数据库的同名隔离级别。

Read Skew

诵读偏序(Read
Skew)是RC级遇到的题目。如果数据项x与y存在一致性约束,T1优先对读x,而后T2修改x和y后commit,此时T1再念y。T1落的x与y不满足原有的一致性约束。

MySQL默认隔离级别也RR,我们需要手工安装为RC并初始化数据

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;

始于数据Tom与Kevin的账户合计为100,在T1事务内之星星点点涂鸦读取得到账户合计为130,显然不切合之前的一致性约束。

上这些异常现象后,Critique给有了新的矩阵,相比ANSI更加圆满与否再也贴合真实的数据库产品。

图片 4

主流数据库考虑到离谱行化效果以及出新性能的抵,一般默认隔离级别都在RC与RR之间,部分提供了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的RC与RR级别都采取了SI,如果手上工作(T1)读操作的数让别作业的写操作加锁,T1转向回滚段读取快照数据,避免读操作让死。但是RC的快照定义和以上描述不同,也席卷了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的RC与RR级别都采用了SI,如果手上业务(T1)读操作的多少为另外业务的抒写操作加锁,T1转向回滚段读取快照数据,避免读操作为死。但是RC的快照定义及上述描述不同,也席卷了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由Michael
James Cahill在外的论文”Serializable Isolation for Snapshot
Databases”[3]遭提出(该论文得到2008 Sigmod Best Paper
Award,文章最后提供了该论文的2009年整体版本[4]连带信息,有趣味的同班可以深入研讨)。SSI保留了SI的多优点,特别是朗诵不封堵任何操作,写不会见卡住读。事务依然当快照中运作,但多了针对业务中读写冲突之督察用于识别事务图(transaction
graph)中的责任险结构。当一组连发事务可能出异常现象(anomaly),系统将经过回滚其中一些事情进行干涉为扫除anomaly发生的可能。这个历程尽管会导致某些事情的谬误回滚(不会见招anomaly的工作让误杀),但可以管消除anomaly[3]。

于理论模型看,SSI性能接近SI,远远好于S2PL。2012年,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由Michael
James Cahill在外的舆论”Serializable Isolation for Snapshot
Databases”[3]遭逢提出(该论文得到2008 Sigmod Best Paper
Award,文章最后提供了拖欠论文的2009年一体化版本[4]相关消息,有趣味之同室可以深深钻研)。SSI保留了SI的不在少数亮点,特别是读不封堵任何操作,写不见面死读。事务依然当快照中运行,但增加了针对作业间读写冲突的监察用于识别事务图(transaction
graph)中的危险结构。当一组并发事务可能有异常现象(anomaly),系统将通过回滚其中一些事情进行干预为祛除anomaly发生的或许。这个过程虽然会造成某些事情之错误回滚(不见面招致anomaly的事体让误杀),但可保消除anomaly[3]。

打理论模型看,SSI性能接近SI,远远好让S2PL。2012年,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

相关文章