于我们已经花了几天的时间绘制了异常图并查看了隔离级别,所以我想在这一周结束时快速回顾一下分布式存储的会话异常和一致性级别。在论文方面,我从以下几个方面得出了这方面的主要资料:
    高度可用的事务:优点和限制,以及线性化与串行化
    在数据库系统社区中,最高标准是可串行化。在过去的几天里,我们花了很多时间来研究这个问题。串行化涉及跨潜在多个对象对多个操作进行分组的事务。可序列化的调度是与事务的某种顺序相对应的调度,以便它们在时间上一个接一个地发生(没有并发/重叠的事务)。这是事务之间隔离的最高形式。
    serializable.png
    在分布式系统社区中,最高标准是线性化。线性化涉及对单个对象的单个操作。一个线性化的时间表是每一个操作似乎在一个时间点原子发生的时间表。写入完成后,所有后续读取(挂钟时间)都应看到该写入的值或后续写入的值。在分布式环境中,我们可能有一个对象状态的多个副本,在一个可线性化的调度中,就好像它们都是在一个时间点同时更新的。
    linearizable.png
    线性化能力不仅仅适用于分布式环境,尽管这正是我在这里关注的。例如,我们也可以讨论多处理器系统中操作的线性化能力。
    严格的可串行性是可串行性和线性化的结合-事务按实时顺序排列。如果数据库只有一个线程,并且按照在该线程上提交的顺序一次处理一个事务,那么您将得到这样的结果。
    当我们使用分布式数据存储时,所有的术语都会变得有点混乱,因为两个社区以不同的方式使用相同的词,特别是术语“一致性”。

    当我们谈论一致性时,我们谈论什么?
    我们在过去几天一直在讨论的一致性是在满足所有数据完整性约束时产生的数据库状态的一致性。这是酸中的C。事务将数据库从一个一致的状态移动到另一个一致的状态,并且由于它们是原子的(可序列化时)完全隔离的,因此您永远不会看到不一致的中间状态。
    当我们谈论“最终一致性”或“因果一致性”时,我们所谈论的一致性是不同的——这里我们关心的是在多个分布式副本中状态是否一致(即在每个副本中相同)。它是CAP定理中的C。出于这个原因,线性化能力有时也被称为原子一致性——它给人一种错觉,即一致性是即时的,在写操作时完全或完全没有。这个分布式系统版本的术语一致性与consenus相关。您还将遇到术语convergence,这是随着时间的推移,不同副本变得一致(在同一状态上聚合)的过程。

    会话异常
    串行化和线性化都需要(潜在的昂贵的)协调。因此,正如我们考虑弱于可串行化的隔离级别一样,我们也可以考虑弱于可线性化的一致级别。在较弱的一致性水平上,可以观察到非线性现象(异常)。
    当对某个对象的读取返回给定版本,而对同一对象的后续读取返回较早版本时,会话中会发生非单调读取异常。单调读取保证防止这些异常,并确保每个项目的读取按总顺序进行。
    monotonic-reads.png

    如果会话的写入变得无序可见,则会发生非单调写入异常。单调写入保证防止这些异常,并确保会话中的所有写入按顺序可见。
    monotonic-writes.png
    如果会话观察到事务T1的效果,然后提交T2,而另一个会话看到的是T2的效果,而不是T1,则会发生非单调事务异常。Writes Follow Reads保证防止这些异常。
    writes-follow-reads.png
    Read Your Writes保证,每当客户端在更新某个值后读取该值时,它都会看到该值(或该值之后安装的值)。据我所知,当你不读不到你的写入数据异常是没有关联声明的。也许我们可以把读不到你写入的数据称为逮捕异常。
    read-your-writes.png

    如果我们把单调读、单调写和读写结合起来,就保证了PRAM(流水线随机存取存储器)的一致性。如果我们在PRAM中添加Writes Follow Reads,我们就得到因果一致性。
    causal-consistency.png