原标题: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算法。 返回搜狐,查看更多

责任编辑:

c语言中cap是什么缩写,ACID中C与CAP定理中C的区别相关推荐

  1. 转载——C语言中float,double类型,在内存中的结构(存储方式)

    最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...

  2. ACID中C与CAP定理中C的区别

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

  3. 在c语言中char型数据在内存中的储存形式为什么

    在c语言中char型数据在内存中的储存形式为"ASCII码".在C语言中,将一个字符常量放到一个字符变量中,实际并不是把该字符本身放到内存单元中,而是将与该字符相对应的ASCII码 ...

  4. 在c语言中 char型数据在内存中的存储形式是,在c语言中char型数据在内存中的存储形式是什么?...

    在c语言中char型数据在内存中的存储形式是ASCII码.在C语言中,char型数据是将一个字符常量放到一个字符变量中,并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII代码放到存储单 ...

  5. 素数在c语言表达能力,巧用C语言中的Continue语句解决数论中的问题

    .#0 福建电脑!""#年第$%期 巧用!语言中的!"#$%&'(语句解决数论中的问题 杨爱梅 !河南工业大学河南郑州"#$$#%& !摘要!运 ...

  6. c语言中的if语句_If ... C中的其他语句解释

    c语言中的if语句 Conditional code flow is the ability to change the way a piece of code behaves based on ce ...

  7. c语言中point的用法_C/C++中 *和amp;的爱恨情仇

    C++中&和*的用法一直是非常让人头疼的难点,课本博客上讲这些的知识点一般都是分开讲其用法的,没有详细的总结,导致我在这方面的知识结构格外混乱,在网上找到了一篇英文文章简单总结了这两个符号的一 ...

  8. r语言中的while循环_R编程中的While循环

    r语言中的while循环 In addition to the for loop we discussed earlier, R also offers another kind of loop to ...

  9. 编程c语言中,向上取整函数_C编程中的函数

    编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...

最新文章

  1. 一台主机装两个mysql数据库_一台主机装两个mysql数据库
  2. Unity Pro builder创建模块化仓库建筑学习教程
  3. 被IP代理网站屏蔽了,真是跪了
  4. eureka集群 ha_Eureka
  5. RedHat系统常用的日志文件详解三
  6. ElementUI中Transfer穿梭框的使用、赋值取值进而实现新增和编辑功能
  7. Mysql 创建表、存储过程、触发器 -Angelo 分享
  8. Java多线程编程(2)--多线程编程中的挑战
  9. 《ASP网络编程从入门到精通》
  10. win7系统如何卸载漏洞补丁--win10专业版
  11. 计算机主机后面辐射大,电脑背面辐射最大吗
  12. 苹果鼠标右键怎么按_精选分享,你不了解的这些鼠标增强神器
  13. windows xp系统本地连接提示受限制或无连接怎么办
  14. 杂谈 跟编程无关的事情10
  15. 鸿蒙坐骑九彩祥云,封神演义五大神兽坐骑排名,第一名太出人意料了!
  16. Spring三大核心思想
  17. 华硕天选1隐藏盘恢复系统
  18. 【线性代数】7-2:线性变化的矩阵(The Matrix of a Linear Transformation)
  19. VC++中利用磁盘序列号识别正版软件
  20. Day4-2 retrofit

热门文章

  1. 开源项目之饭否 for Android
  2. 笨办法学python练习35分支与函数
  3. DBMS的完整性违约处理机制
  4. 17款好用的跨浏览器测试神器,兼容性测试必备
  5. 无线通信sip服务器常用品牌,一种无线Mesh网中多SIP服务器布局方法
  6. FLV视频转换的利器 - ffmpeg.exe
  7. Python微信点赞
  8. java怎么提升编程能力_怎样提升java编程能力
  9. 闲谈“个人核心竞争力”与“危机感”
  10. 5 极限存在准则及两个重要极限