摘要
当前的商业数据库允许应用程序开发人员为了性能而牺牲一致性。然而,现有的弱一致性级别的定义要么不够精确,要么不允许使用诸如乐观锁等高效的实现技术。排除这些技术尤其不幸,因为商业数据库支持乐观机制。此外,乐观锁很可能成为未来地理分布和移动系统中首选的实现技术。
本论文首次提出了现有 ANSI 隔离级别的独立于实现的规范,以及在商业系统中广泛使用的若干级别的规范,例如,游标稳定性、快照隔离。它还以独立于实现的方式为基于谓词的操作指定了各种保证。定义了两个新级别,为应用程序编写者提供有用的一致性保证;一个是确保一致读取的最弱级别,而另一个则捕获了悲观实现所提供的某些有用的一致性属性。我们使用基于图的方法以简单直观的方式定义不同的隔离级别。
论文描述了在分布式客户端-服务器环境中支持不同弱一致性级别的新实现技术。这些机制基于乐观锁,并利用多部分时间戳。提出了一种新技术,允许多部分时间戳随着系统中客户端和服务器数量的增加而良好扩展;该技术利用松散同步的时钟来从多部分时间戳中移除旧信息。
本论文还展示了一项模拟研究的结果,以评估我们的数据传输客户端-服务器系统中乐观方案的性能。结果表明,对于低争用工作负载,提供可串行化相对于提供较低一致性保证的机制的成本可以忽略不计;此外,即使对于中等到高争用的工作负载,可串行化的成本也很低。模拟研究还表明,我们基于多部分时间戳的机制在为只读和执行事务提供强一致性保证的同时,对 CPU、内存和网络成本的影响非常小。
致谢
我要感谢我的研究导师,Barbara Liskov,在她作为我研究生期间,为我提供了持续的支持和建议。我从她那里学到了许多关于如何进行良好研究的原则,特别是关于将系统设计的理论方面与实际实现结合起来。
我的论文委员会成员为改进这项工作的内容和展示提出了许多优秀的建议。John Guttag 和 John Chapin 提出了有助于阐明论文不同部分的建议。Jim Gray 提供了关于当前数据库系统的极其有用的反馈,这帮助我解决了定义弱一致性级别时的一些重要问题。
许多人为我在麻省理工学院的研究生生活提供了愉快的体验。如果我是一个更好的计算机科学家和更好的人,那是因为我的朋友和同事的陪伴和建议。他们对我产生了积极的影响,并在许多方面丰富了我的生活。
我在编程方法学小组的同事们提供了一个刺激的技术讨论环境。通过与 Andrew Myers 和 Miguel Castro 的互动,我学到了许多关于计算机系统的有趣方面。我与 Phillip Bogle、Chandrasekar Boyapati、Mark Day、Robert Gruber、Sanjay Ghemawat、Umesh Maheshwari 和 Quinton Zondervan 的讨论也对我大有裨益。Dorothy Curtis 和 Paul Johnson 在设备和软件方面多次帮助我。Kavita Bala、Radhika Nagpal 以及每个小组成员总是愿意参加我的练习演讲,并提供反馈以改进我的演讲。
我将永远珍惜与 PM 小组成员愉快轻松的经历。我喜欢与 Andrew Myers 一起策划电影之夜和解谜,与 Jason Hunter 讨论《星球大战》,与 Arvind Parthasarathi 和 Doug Wyatt 交换友好的玩笑,以及与 Chandrasekar Boyapati、Umesh Maheshwari、Quinton Zondervan 和小组中的其他人进行无数次的知识性对话。
Phil Bogle 和 Sudhendu Rai 一直是我不断鼓励和灵感的源泉。Sudhendu 关于研究和哲学的建议在改善我对生活的看法方面发挥了重要作用。Ujjwal Sinha 和 Ananda Sen Gupta 总是在我需要支持时出现。他们是极好的伙伴,我和他们一起看电影、聊天、短途旅行都很开心。Aman Rustagi、Sreeram 和 Sandeep Gupta 是我一直珍视的朋友,他们总是给予我美好的祝愿,我喜欢和他们在一起的时光。
言语无法表达我对父母的感激之情,他们应该为我生活中取得的任何积极成就获得赞誉。他们一直支持我所有的努力,并耐心地等待我完成博士学位。最后但同样重要的是,我的妻子 Vandana,在我努力完成论文的过程中一直非常支持和鼓励我。
Introduction
Existing Definitions
Proposed Specifications for Existing Isolation Levels
System Model and Terminology
Database Model
Transaction Histories
Predicates
Conflicts and Serialization Graphs
定义 2:Directly Read-Depends
对 直接读依赖,当且仅当 对 直接项读依赖或直接谓词读依赖。记为 。 直接项读依赖(Directly item-read-depends):我们说,如果
安装了某个对象版本 并且 读取了 ,那么 直接项读依赖于 。 直接谓词读依赖(Directly predicate-read-depends):如果
执行了一个操作 并且 ,那么我们说事务 直接谓词读依赖于 。
Isolation Levels for Committed Transactions
Isolation Level PL-1
- G0:写环,即完全由
边构成的环。
PL-1 不允许出现 G0。
Isolation Level PL-2
- G1a: Aborted Reads.
- G1b: Intermediate Reads.
- G1c: Circular Information Flow.
- G1-predA: Non-atomic Predicate-based Reads.
- G1-predB: Non-atomic Predicate-based Reads with respect to Transactions.
Isolation Level PL-3
- G2: Anti-dependency Cycles.
Isolation Level PL-2.99
- G2-item: Item Anti-dependency Cycles.
Summary of Isolation Levels
异象编号 | 别称 | 描述 |
---|---|---|
G0 | Write Cycles | 完全由 |
G1a | Aborted Reads | 读取已回滚的事务写的值。 |
G1b | Intermediate Reads | 读到的值随后被同一事务覆盖。 |
G1c | Circular Information Flow | 完全由依赖边组成的环。 |
G2 | Anti-dependency Cycles | 环包含一个或多个 |
G2-item | Item Anti-dependency Cycles | 环包含一个或多个项 |
级别 | 禁止的现象 | 非正式描述( |
---|---|---|
PL-1 | G0 | |
PL-2 | G1 | |
PL-2.99 | G1, G2-item | |
PL-3 | G1, G2 |
Mixing of Isolation Levels
Guarantees to Transactions in Mixed Systems
在混合系统中,每个事务在启动时指定其隔离级别;此信息作为历史记录的一部分被维护(在我们的示例中,我们不使用任何符号,而是在文本中简单地指示不同事务的级别),并用于构建混合序列图(MSG)。与 DSG 一样,MSG 包含对应于已提交事务的节点和对应于冲突的边;然而,只有与事务级别相关或必须的(obligatory)冲突才作为边出现在图中。如果事务
边的添加方式如下:由于写依赖在所有级别都相关,我们保留所有此类边。对于 PL-2 或 PL-3 节点
现在我们可以定义混合历史记录的正确性:
定义 10:混合正确 Mixing-Correct
如果
是无环的,并且对于 PL-2 和 PL-3 事务不出现现象 G1a 和 G1b,则历史记录 H 是混合正确的。 上述定义可以重新表述为隔离定理 [GR93] 的类似物:
混合定理:
如果历史记录是混合正确的,则每个事务都获得与其级别相关的保证。
上述定理在历史记录级别上成立,与同步实现方式无关。注意,提供给每个级别的保证是相对于 MSG 的。原因是 MSG 考虑了其他级别事务的存在,而 DSG 只是简单地用所有边构建。正如我们下面讨论的,如果 PL-1 和 PL-2 事务“知道”它们在做什么,MSG 对于确定正确性是有用的,而 DSG 在不对较低级别事务的操作做出任何假设的情况下确保正确性。
混合系统也可以使用锁定(使用标准的短读/写锁组合)来实现,所有由锁定系统生成的历史记录都是混合正确的。现象 G1a 和 G1b 不能出现在 PL-2 或 PL-3 中,因为这样的事务只读取已提交事务的更新。此外,MSG 中没有环,因为存在以下属性:如果 MSG 中有从
混合系统也可以使用其他并发控制技术来实现。例如,乐观实现将尝试将每个提交事务放入基于其自身要求(针对其级别)和对更高级别运行事务的义务的序列中,并且如果无法做到这一点,则会中止该事务。第 5 章中提出了一个混合正确的乐观实现。
Consistency of Database State
即使一个历史
例如,假设一个数据库包含三个对象
在这个历史中,
假设事务正在维护一个不变式
正如 [GR93] 中所述,为了确保 PL-3 事务观察到一个一致的状态,低级别的事务必须“知道”它们在做什么,即,即使它们观察到一个不一致的状态,它们也必须以某种方式一致地更新数据库。同样,一个无环的 MSG 确保如果每个低级别的事务在代码中正确处理不一致性,事务将更新并观察到一个一致的数据库状态。因此,尽管
Guarantees to SQL Statements
在大多数商业数据库系统中,使用像 SQL 这样的语言来访问和修改数据库对象。这些系统确保某些保证适用于事务执行的 SQL 语句。我们现在描述如何在我们的框架中提供此类保证。考虑以下 SQL 应用程序代码:
1 |
|