从ACID到CAP及BASE
ACID
说到事务,肯定想到事务的ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
1.原子性:全部成功或者全部失败。
2.一致性:不好描述,取个例子:银行转账,TOM给JIM转1000元,TOM的账户减少1000,同时JIM的账户要增加1000。不允许出现只减少或者只增加的情况。
3.隔离性:事务之间不能项目干扰。包含四种隔离级别,即read_uncommitted、read_committed、repeatable_read、serializable。
3.1 read_uncommitted:该隔离级别会发生脏读。举个例子,事务A更新字段的值从1到10,事务B在此过程中可以读到该字段的值1,2,3,4,5…10。
3.2 read_committed:该隔离级别不可重复读。举个例子,事务A更新字段的值从1到10,事务B在此过程中只能读到事务A提交后的值10。若此时有另外一个事务执行更新字段从10到20,那么事务B再次读取会读到20。
3.3 repeatable_read:该隔离级别会发生幻读。举个例子,事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
3.4serializable:最严格的事务隔离级别。要求所有事务都串行执行,不能并发。
4.持久性:事务一旦提交,事务的数据就会永久保存下来。
提供一个隔离级别对比表格:
隔离级别 |
脏读 |
可重复读 |
幻读 |
Read_uncommitted |
存在 |
不可以 |
存在 |
Read_committed |
不存在 |
不可以 |
存在 |
Repeatable_read |
不存在 |
可以 |
存在 |
Serializable |
不存在 |
可以 |
不存在 |
CAP
提到分布式事务,应该就会想到CAP。一个分布式系统是不可以同时满足一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)
1.一致性:分布式系统中多个副本数据保持相同。
2.可用性:系统提供的服务处于可用状态,能够在有限的时间后返回结果。
3.分区容错性:分布式系统在遇到任何网络分区故障的时候,必须能够保证对外提供给满足一致性和可用性的服务,除非整个网络出现问题。
以上三点,对于一个分布式系统不可能同时满足,但是分区容错性是最基本的。
放弃CAP定理 |
描述 |
放弃P |
如果希望避免系统出现分区容错性问题,一种较为简单的做法是将所有数据放在一个分布式节点上。这样至少不会碰到由于网络分区带来的负面影响,如果放弃P,就意味着放弃系统可扩展性。 |
放弃A |
如果遇到网络分区故障或者其他故障,那么受影响的服务需要等待一定的时间,在等待期间服务无法对外提供服务。 |
放弃C |
放弃一致性是放弃数据的强一致性,保留数据的最终一致性。 |
BASE
base是Basically Available(基本可用)、soft state(软状态)、Eventually consistent(最终一致性)的缩写。
基本可用:分布式系统出现不可预知的故障时,允许损失部分可用性。例如响应时间上的损失、功能上的损失。
软状态:允许系统的在不同的节点的数据副本之间进行数据同步时存在延迟。
最终一致性:本质是保证数据最终能达到一致。包括因果一致性、读已之所写、回话一致性、单调读一致性、单调写一致性。
原文地址:https://www.cnblogs.com/share2perfect/p/9529273.html