转载自  ACID中C与CAP定理中C的区别

ACID和CAP定理中都有C,代表Consistent一致性,很多人容易将这两个C混为一谈,其实这两个一致性是有区别的。

事务的定义是一系列操作要么全部成功,要么全部不成功,数据库的事务机制是通过ACID实现的,数据库ACID的具体定义见这里,ACID中的一致性的定义是:一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性。

如果说ACID的C是节点服务器的数据完整性,而CAP的一致性是分布式多服务器之间复制数据以取得这些服务器拥有同样的数据,这是一种分布式领域的一致性概念。因此两者是完全不同的概念。

分布式领域中的一致性有的强弱之分,强一致性也就是指一旦有写操作写入任何一个服务器,立即在其他服务器之间同步复制新的数据,这样, 任何服务器上任何读操作总是能看到最近写入的新数据。如果不能立即看到最近写入的新数据,而可能过了一段时间才能看到,则属于弱一致性或最终一致性了。

强一致性分为由写实现一致性Consistency by writes、由读实现一致性Consistency by reads和由冲裁实现一致性Consistency by Quorum。

由写实现一致性:在写入数据同时,将数据复制到其他服务器上,读取任何一台都可以获得新的写入数据,复制数据是在写操作完成,读操作轻量。

由读实现一致性:写入一旦服务器后,不再复制,而是在读取时使用版本来协调复制(如vector clock算法),这样我们简化了写操作,而将负担加在读操作。

由冲裁实现一致性:如果写入时复制到其他2/3大多数服务器,读取时也是从2/3大多数服务器读取,读取这边负责解决哪个更新是最新结果,这在读操作和写操作之间分担了负载。

回到事务话题,如果要在分布式系统中实现像ACID那样的事务机制,只有强一致性还是不够的,如果我们操作步骤顺序很重要,不可以中断或打乱,我们要么一起一次执行它们,如果并发执行这些操作步骤,无论怎么并发,也要如同它们是在独立执行,我们最终得到的结果总是相同的,这是一种更强的一致性:线性一致性linearizable consistency,类似ACID中的隔离层(serial isolation level)。

The CAP FAQ将CAP定理中的一致性定义为这种线性一致性或称为atomic原子一致性。一种比普通一致性更强的一致性,这也是大家又将ACID的C和CAP的C等同在一起的原因。ACID的C与CAP的C的关系类似精确与一致性的关系,如下图:

这种分布式的线性强一致性有两种实现方式:2PC两段提交和Paxos算法是常见两种。

通过2PC写入新数据需要经过两次来回,第一次请求commit,第二次才正式确认commit,在这两者之间过程中,所有服务器都会堵塞等待发起者发出整个事务成功还是失败的结果(只有发起者知道所有服务器的情况),如果失败,所有服务器返回之前状态,相当于写入数据失败,写入数据没有发生过一样。

而Paxos算法能够回避2PC的堵塞死锁等问题更好地实现服务器之间数据强一致复制,具体内容见:Paxos算法。也可参考比Paxos算法改进的Raft算法。

参考:
Lightweight transactions in Cassandra 2.0
Distributed algorithms and protocols:Consistency
The Consistency Alphabet Soup

ACID中C与CAP定理中C的区别相关推荐

  1. c语言中cap是什么缩写,ACID中C与CAP定理中C的区别

    原标题:ACID中C与CAP定理中C的区别 ACID和CAP定理中都有C,代表Consistent一致性,很多人容易将这两个C混为一谈,其实这两个一致性是有区别的. 事务的定义是一系列操作要么全部成功 ...

  2. 分布式系统理论 - CAP定理和BASE理论

    分布式系统理论 - CAP定理和BASE理论 分布式系统理论 - CAP定理和BASE理论 一.前言 二.CAP定理 2.1.概述 2.2.一致性(C:Consistency) 2.3.可用性(A:A ...

  3. CAP定理和BASE理论

    CAP定理和BASE理论 一.CAP定理是什么? 二.BASE理论是什么? 一.CAP定理是什么? CAP定理:在一个分布式系统中,最多只能同时满足一致性.可用性和分区容错性这三项中的两项. C:一致 ...

  4. signature=c88a0f4ae4be8f22f567611f36d2d20d,ブロードキャスト専用ネットワーク間の中間 IP マルチキャスト ヘルパーの設定...

    ブロードキャスト専用ネットワーク間の中間 IP マルチキャスト ヘルパーの設定:例 次に.ブロードキャスト専用ネットワーク間で中間 IP マルチキャスト ヘルパーを設定する例を示します.この例で使用さ ...

  5. CAD中怎么生成设备基础定位图?

    在使用国产CAD制图软件绘制给排水图纸的过程中,有些时候会需要对已经画好的设备基础生产定位图,那么CAD软件中怎么生成设备基础定位图呢?接下来的CAD入门教程就让小编来给大家介绍一下国产CAD制图软件 ...

  6. 切条机切带机中达优控定长送料触摸屏一体机程序 超声切带和热切都可以通用 触摸屏软件一起发,PLC用三菱软件

    切条机切带机中达优控定长送料触摸屏一体机程序 超声切带和热切都可以通用 触摸屏软件一起发,PLC用三菱软件 送料方式可选,切长的用夹手加滚筒送料,切短的用滚筒送料,切带长度任意调整,可以设定产量,切完 ...

  7. 毕业论文关键字HTML5,毕业论文中关键词应该怎么定

    毕业论文中关键词应该怎么定 关键词是以论文文献的标引为目的的,用来表示全文主要内容信息的词语.在一篇论文中可以选择三到八个词语来作为关键词.关键词或主题词的一般选择方法是. 作为一个每年指导本科论文加 ...

  8. 乘方运算中的“次幂”和“次方”有什么区别?

    一个数的"N次幂"和"N次方"在意义上有什么区别?为什么要用不同的名称? 答1: 从数学角度来说,没有什么大的区别.意义都是一致的,都表示N个相同数的连乘. 从 ...

  9. PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)

    PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别) 一.总结 一句话总结: throwable接口+Error类 在PHP7更新中有一条:更多的Error变为可捕获的Exce ...

最新文章

  1. 拉格朗日乘数法的原理,我用10幅图把它讲清楚了
  2. js生日计算年龄_如何提取身份证生日和年龄,几行VBA代码教你学会
  3. eclipse中使用javadoc生成文档
  4. 【视频】vue生命周期函数
  5. 技巧心得:Linux技巧小总结
  6. SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)
  7. Linux学习笔记003----linux yum命令详解
  8. border-box和CSS3 calc()解决盒模型加边框或边距后尺寸变大的问题
  9. win11如何开启GUEST账户 windows11开启GUEST账户的设置方法
  10. typora 有道云笔记_有道云—目前最好用的免费笔记
  11. opennms安装心得
  12. pyspark env: ‘python’: No such file or directory
  13. django manage.py model 删除表后怎么重新生成数据库表
  14. 1. C++dump编程
  15. NYOJ 2括号配对 栈的运用
  16. Ubuntu下Hbase安装(一、相应的版本Hbase下载)
  17. 面试题28:JS实现继承有几种方式
  18. uva 10099(最短路径)
  19. APP在推广之渠道为王(三 )
  20. torch.max使用示例

热门文章

  1. [数据结构-严蔚敏版]P65离散事件模拟(银行客户的离散事件驱动模拟程序)
  2. [JS-DOM]事件监听机制
  3. [C++11]可调用对象
  4. 洛谷 P1506 拯救oibh总部-dfs染色法
  5. 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树
  6. openresty+mysql+乱码_openresty记录响应body乱码问题
  7. 2019 秦皇岛 I - Invoker Gym - 102361I dp
  8. CF1342E. Placing Rooks
  9. P2575 高手过招
  10. P3992 [BJOI2017]开车