内部一致性与相互一致性关系总结

来源:互联网 发布:淘宝网排名怎么靠前 编辑:程序博客网 时间:2024/05/21 10:20

参考:

  • 【1】Thomas R H. A majority consensus approach to concurrency control for multiple copy databases[J]. ACM Transactions on Database Systems (TODS), 1979, 4(2): 180-209.

在分布式系统中,一个数据有多个副本,由于存在节点间通讯的延迟,当进行一个更新操作时,不可能保证所有副本所有时间都一样,或多或少都会有不相同的的时间差。

一个更新操作要保证副本之间的 相互一致性 和每个副本的 内部一致性 。下面就来介绍这两种一致性的联系。

举例

这个例子用来后边的讨论。

数据库中有两个节点A和B,分别存储3个数据x,y,z,值都为1。

  • A:x=1,y=1,z=1
  • B:x=1,y=1,z=1
  • 内部约束:x+y+z=3

现在有两个更新操作:

  • update1:x=-1, y=3
  • update2:y=-1, z=3

内部一致性(ACID中的C)

ACID中的C。

内部一致性是一种应用程序指定的不变性。这种一致性关心一个数据库内不同数据项之间的关系不变。保证内部一致性不仅依赖应用程序而且依赖存储系统。【1】【2】关于内部一致性的定义大家的观点比较相同。

上边的例子中,x+y+z=3就是内部一致性约束。

如果两个update都执行了,那么有两种顺序,两个节点的数据只可能是下面两种情况:

  • update1->update2: x=-1,y=-1,z=3
  • update2->update1: x=-1,y=3,z=3

那么每个节点的内部一致性(x+y+z=3)都会被破坏。所以至少有一个update要被拒绝,这就是并发控制要干的事了。并发控制要保证每个节点的内部一致性(通过锁机制等)。可以看到每一个update更类似一个事务,事务本身应该满足内部一致性。当多个事务并发执行时需要系统保证其隔离性来保证内部一致性。

相互一致性(CAP中的C)

由于这篇文章为了区别内部一致性与相互一致性。所以不过多涉及相互一致性的定义。仅把相互一致性最后需要满足的相互一致与内部一致性进行比较。

相互一致:多个副本的值相同。如果一个系统中数据的多个副本值都相同,那么系统就处于相互一致的状态。

以上边的例子,来说明相互一致和内部一致性的关系。如果两个节点分别接受了其中一个更新操作:

  • A:update1: x=-1,y=3,z=1
  • B:update2: x=1,y=-1,z=3

那么两个节点的内部一致性(x+y+z=3)都没有被破坏。但是两个节点的数据不一样了,也就是不相互一致了。保证相互一致需要所有节点对并发的冲突操作做出相同的判断。