A Critique of ANSI SQL Isolation Levels论文阅读

本文深入探讨了ANSI SQL定义的隔离级别,包括脏读、不可重复读和幻读等现象,并分析了不同隔离级别的锁实现。论文指出,ANSI SQL的隔离级别定义存在不足,提出了快照隔离作为更好的解决方案,并讨论了其与传统隔离级别的对比。

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
ANOMA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值