ScholarGate
助手

隔离级别

隔离级别定义了事务在多大程度上免受其他并发事务的影响,它以牺牲部分隔离保证为代价,换取更高的并发性和吞吐量。

用 PaperMind 寻找选题即将推出Find papers & topics
Tools & resources
下载幻灯片
Learn & explore
视频即将推出

Definition

隔离级别是关于事务可能观察到的并发异常的规范;更高级别以降低并发性为代价阻止更多异常(直至完全可串行化),而更低级别则允许某些异常以换取性能。

Scope

本主题涵盖了标准隔离级别——读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)和可串行化(serializable)——这些级别是根据它们允许或阻止的现象(脏读、不可重复读、幻读)来定义的,还包括了将这些级别重新定义为允许的异常的具有影响力的批判性研究,以及实际中重要的快照隔离(snapshot isolation)及其异常,例如写倾斜(write skew)。它探讨了一致性与并发性之间的权衡。本主题不包括实现这些级别的底层锁定和多版本机制。

Core questions

  • 每个隔离级别允许哪些异常——脏读、不可重复读、幻读?
  • SQL标准如何定义这四种隔离级别?
  • 为什么研究人员批评基于异常的定义是模糊的?
  • 快照隔离处于何种位置,它可能允许哪些异常(例如写倾斜)?
  • 应用程序如何为给定的工作负载选择隔离级别?

Key concepts

  • 读未提交
  • 读已提交
  • 可重复读
  • 可串行化
  • 脏读
  • 不可重复读
  • 幻读
  • 快照隔离和写倾斜

Key theories

基于异常的隔离级别
SQL标准通过它们允许的三种现象——脏读、不可重复读和幻读——来定义隔离级别,范围从读未提交(全部允许)到可串行化(全部不允许)。
对ANSI隔离级别的批判
Berenson及其同事的研究表明,标准中基于现象的定义是模糊的,并且不能清晰地描述多版本系统,他们引入了快照隔离作为一种独特的、被广泛实现但未被原始定义涵盖的级别。
快照隔离及其异常
在快照隔离下,每个事务都读取其开始时的一致快照,从而在没有读锁的情况下提供强大的读取行为,但它可能允许非可串行化异常,例如写倾斜,这促使了可串行化快照隔离的出现。

Clinical relevance

隔离级别是应用程序开发人员一项常规但重要的配置选择:选择过弱的级别可能会通过细微的异常悄无声息地破坏数据,而始终使用可串行化则可能限制吞吐量,因此理解这些级别对于正确、高性能的事务性应用程序至关重要。

History

ANSI/ISO SQL标准根据允许的现象定义了隔离级别。1995年,Berenson、Bernstein、Gray和O'Neils的批判性研究揭示了这些定义中的模糊性,并描述了快照隔离,主流的多版本数据库采用了快照隔离。后来的工作定义了可串行化快照隔离(serializable snapshot isolation)以弥补剩余的异常差距。

Debates

通过异常定义隔离与通过可串行性定义隔离
标准的异常列表定义易于陈述但模糊,并且不适用于多版本系统;另一种方法是直接通过可串行性定义正确性,这种方法更清晰,但更难与开发人员实际配置的级别对应起来。

Key figures

  • Jim Gray
  • Philip Bernstein
  • Hal Berenson

Related topics

Seminal works

  • berenson1995
  • gray1992

Frequently asked questions

不可重复读和幻读有什么区别?
不可重复读发生在事务两次读取同一行,但由于另一个事务在此期间更新了它而看到不同的值。幻读发生在事务重新运行带有搜索条件的查询时,看到另一个事务插入的新行。可重复读可以防止前者;只有可串行化才能可靠地防止幻读。
快照隔离与可串行化相同吗?
不。快照隔离为每个事务提供一个一致的快照,并防止脏读和不可重复读,但它并非完全可串行化:它允许写倾斜异常,即两个事务读取重叠数据并进行不相交的更新,这些更新共同违反了某个约束。可串行化快照隔离对其进行了扩展,以消除此类异常。

Methods for this concept

Related concepts