弄清事务一致性

请区分这些一致性

  1. 数据库ACID中的consistency:这里的一致性是指在数据库系统中的完整性约束没有被破坏,例如主键、外键、触发器、check等约束,或者用户程序中定义的一致性条件。
  2. CAP理论的一致性:强一致性,所有节点在同一时刻具有相同的值,都是最新的数据副本。这里的一致性其实可以看作一致性模型的一种“线性一致性”。
  3. 一致性模型:在并发编程中,系统和开发这之间的一种约定,如果开发者遵循某些规则,那么执行读操作和写操作的结果是可预测的,所谓“可预测”,对应了程序逻辑的正确性。

本次阐述的一致性均代指一致性模型中的一致性。

常见的几个一致性模型

image-20231203213149207

如上图所示,一致性模型具有三类,绿色代表不可用,蓝色代表基本可用,黄色代表高可用。如何理解?“不可用”表示当系统为了保证CAP中的CP时,系统将变得不可用;“基本可用”表示当系统出现故障节点时仍然可用,但是客户端不能将请求发送到不可用的副本节点;“高可用”表示当系统发生了网络分区之后,在无故障节点上依然可用。下面介绍下这几个一致性。

  • 线性一致性(强一致性、严格一致性、原子一致性):最强的一致性模型,当系统从表现上看就像是只有一个节点,所有操作看起来都好像是原子的,所有操作就像是在一个全局时钟下执行的原子操作。

  • 顺序一致性:同一个客户端或进程的操作在排序后保持先后顺序不变,执行结果符合某个顺序执行的结果。

  • 因果一致性:必须以相同的顺序看到因果相关的操作。

    微信朋友圈评论就使用了因果—致性°微信的数据分布在上海、深训、香港和加拿大数据中心。加入一个用户发表了一条朋友圈,上海的朋友和香港的朋友都来评论,这时如何保持正确性和一致性呢?

    (1)每条评论都有一个唯一且单调递增的数字ID,评论ID需要全局唯—;

    (2)每条新评论的ID都必须比本地已经见过的全局最大的ID大,确保因果关系;

    (3)广播本地看到的所有评论和新评论到其他数据中心;相同ID的评论合并排重;

    例如香港的朋友发表ID为2的评论,接着系统广播上海朋友的评论到其他数据中心上,上海朋友的多条评论ID为[1,4,7],此时如果香港的朋友再发表评论,那么ID就要为8以维持因果顺序。评论ID合并后为[1,2,4,7,8]

  • 最终一致性:操作之间没有因果,允许使用更宽松的一致性模型。

  • 单调读:如果客户端读到关键字x的值为v,那么该客户端对于x的任何后续的读操作必须返回v或比v更新的值,即保证客户端不会读到旧的值。

  • 单调写:同一个客户端(或进程)的写操作在所有副本上都以同样的‖顷序执行’即保证客户端的写操作是串行的。例如,客户端先执行写操作×=0再执行写操作x=1,如果另—个客户端不停地读x的值,那么会读到x的值先为0再为1,不会读到1再读到0。

  • 读你所写:当写操作完成后,在同一副本或其他副本上的读操作必须能够读到写入的值。注意,读你所写一致性必须是单个客户端(进程)。

  • PARM一致性:它由单调读、单调写和读你所写三个一致性模型组成,同一个客户端的多个写操作将被所有的副本按照同样的执行顺序观察到,但不同客户端发出的写操作可以以不同的执行顺序被观察到。