首页 > 数据库 > 数据库开发技术 > 关于ANSI SQL隔离级别的评论
1介绍
在不同隔离级别下运行并发事务,允许应用设计者在正确性和吞吐量之间做一个权衡。低隔离级别可以提升事务并发度,但会增加事务不正确性风险。令人惊讶的是,即使某些事务运行在最高隔离级别(序列化级别)下,而运行在低隔离级别下的并发事务仍然可以读到未提交数据或者过期数据[GLPT]。当然,运行在低隔离级别下的事务还会产生错误数据。应用设计者必须设法阻止运行在高隔离级别上的后继事务访问这些错误数据,从而进一步繁衍这些错误。
ANSI/ISO SQL-92[MS, ANSI]定义了4个隔离级别:1)READ UNCOMMITTED;2)READ COMMITTED;3)REPEATABLE READ;4)SERIALIZABLE。这些隔离级别都是基于经典的序列化理论和是否允许三种现象定义的。这些现象有:Dirty Read、Non-Repeatable Read、Phantom。ANSI并没有对现象这一术语给出清晰的定义,只是说现象是由一系列动作组成,而这些动作组合最终导致某种异常(也许是不可序列化)。由于实际异常远多于ANSI定义的现象(Phenomena),所以本文后继章节使用异常(Anomalies)一词,以表达更广泛的异常类型。本文还会在技术上区分现象和异常,但这种区分对正常理解来说不是必须的。
ANSI隔离级别和锁调度器有着非常大的关系。某些锁调度器允许事务变更锁的范围和持续时间,这违背了两阶段锁理论。[GLPT]给出了定义一致性级别的三种方法:锁、数据流向图和异常。基于现象或者异常定义隔离级别更具有普适性,不是基于锁的标准SQL数据库也能采用这些隔离级别。
本文将给出基于异常定义隔离级别的很多弱点。ANSI定义的3个现象存在很大的模糊性,从而导致一系列违反直觉的结果。在实际应用中,基于Locking的隔离级别和ANSI隔离级别有很多不同特征。这就引起更多困惑,因为商业数据库基本上都是基于Locking的。另外,有些隔离级别在商业数据库中非常流行,而ANSI中定义的现象并不能区分出这些隔离级别。
第2节将会介绍隔离级别相关的术语,并定义ANSI SQL和基于Locking的隔离级别。第3节会讨论ANSI隔离级别的缺陷,并提出一些新的现象,从而定义其他广受欢迎的隔离级别。[GLPT]于1977年定义了一致性度,我们尝试将ANSI SQL隔离级别和这些概念进行合理的映射。描述Cursor Stability和Repeatable Read[DAT]的最新定义,并在统一的框架下讨论隔离级别,从而降低混乱。
第4节引入了被称为快照隔离的多版本并发控制机制,其不会产生ANSI定义的任何现象,但仍然不是可序列化的。快照隔离处于已提交读和可重复读之间,这个位置非常有意思。一种新的形式化定义(可参考本文的加长版[OOBBGM])将为多版本模型而简化的隔离级别和经典的基于Locking的单版本序列化理论联系在一起。
第5节定义了一些新的异常,从而区分第3节和第4节引入的隔离级别。当然此处扩展的ANSI SQL现象仍然不能很好地描述快照隔离和游标稳定的特征。第6节给出总结和结论。
2隔离性的定义
2.1什么是序列化
2.2ANSI SQL隔离级别
2.3Locking
3分析ANSI SQL隔离级别
4其他隔离类型
4.1Cursor Stablity
4.2Snapshot Isolation
4.3其它多版本系统
5总结和结论
附件:博客布局不利于展示表格等内容,本章节详细内容见附件
A Critique of ANSI SQL Isolation Levles .pdf
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69912723/viewspace-2719233/ ,如需转载,请注明出处,否则将追究法律责任。