网站查询域名解析ip,做暧小视频xo网站,wordpress化,个人备案网站做淘宝客可以用吗转载自 ACID中C与CAP定理中C的区别
ACID和CAP定理中都有C#xff0c;代表Consistent一致性#xff0c;很多人容易将这两个C混为一谈#xff0c;其实这两个一致性是有区别的。 事务的定义是一系列操作要么全部成功#xff0c;要么全部不成功#xff0c;数据库的事务机制是…转载自 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.0Distributed algorithms and protocolsConsistencyThe Consistency Alphabet Soup