论文阅读"/>
A Critique of ANSI SQL Isolation Levels论文阅读
A Critique of ANSI SQL Isolation Levels
摘要
ANSI SQL通过脏读、不可重复读和幻想(如幻读)现象定义了隔离级别。这篇论文介绍了这些现象和ANSI SQL定义未能正确描述的几个比较流行的隔离级别,包括所覆盖级别的标准锁的实现。介绍了更好地描述了隔离级别的新现象。最后,定了一个重要的多版本隔离类型,快照隔离(Snapshot Isolation)。
1 引言
ANSI/ISO SQL-92定义了四种隔离级别:(1)读未提交,(2)读已提交,(3)可重复读,(4)序列化。
2 隔离定义
2.1 序列化概念
一个事务由一组把数据库从一个一致性状态转换到另一个一致性状态的操作组成。一个历史记录将一组事务的交错执行建模为其操作的线性顺序,例如对特定数据项的读写(包括插入、更新和删除)操作。如果不同事务在相同数据项上执行并且其中一个为写操作的两个操作被称为冲突。
2.2 ANIS SQL隔离级别
ANSI-SQL隔离设计人员寻求一个定义,允许许多不同的实现,而不仅仅是锁。他们用以下三种现象来定义隔离:
- P1(脏读):事务T1修改一个数据项。另一个事务T2在T1执行提交或回滚操作之前读取了那个数据项。如果T1执行了回滚操作,那么T2就读取了一个从来都没提交过也就是没有真正存在过的数据项。
- P2(不可重复读 或 模糊读):事务T1读取了一个数据项。另一个事务T2修改或删除了那个数据项并且完成了提交操作。如果T1尝试重新读取这个数据项,它就会收到一个修改过的值或者发现这个数据项已经被修改了。
- P3(幻像/幻读):事务T1在满足特定查询条件读取了一个数据项集合。然后事务T2创建了一个满足T1查询条件的数据项并且完成了提交操作。如果T1在相同的查询条件下重新读取,它会得到一个和第一次读取不同的数据项集合。
论文中操作:w表示写,r表示读,c表示提交,a表示终止回滚,P表示查询条件(predicate)。例如:w1[x]:表示事物1在数据项x上的写操作。
对于同一个隔离级别,P是比A更宽松的解释,P可能会导致异常,A是直接指出了异常。
- 脏读:
P1: w1[x]…r2[x]…((c1 or a1)and(c2 or a2)在任意的顺序)
A1: w1[x]…r2[x]…(a1 and c2在任意的顺序)
- 不可重复读:
P2: r1[x]…w2[x]…((c1 or a1)and(c2 or a2)在任意的顺序)
A2: r1[x]…w2[x]…c2…r1[x]…c1
- 幻像(幻读):
P3: r1[P]…w2[y in P]…((c1 or a1)and(c2 or a2)在任意的顺序)
A2: r1[P]…w2[y in P]…c2…r1[P]…c1
Isolation | P1(or A1)脏读 | P2(or A2)不可重复读 | P3(or A3)幻象 |
---|---|---|---|
ANSI READ UNCOMMITTED | Possible | Possible | Possible |
ANSI READ COMMITTED | Not Possible | Possible | Possible |
ANSI REPEATABLE READ | Not Possible | Not Possible | Possible |
更多推荐
A Critique of ANSI SQL Isolation Levels论文阅读
发布评论