数据库ACID(酸):原子性,一致性,隔离性,持久性。数据库
CAP理论:一个分布式系统最多能知足一致性C,可用性A,分区容错性P,三项中的两个。网络
C:更新操做成功且返回请求方完成后,全部节点在同一时间的数据彻底一致。分布式
A:用户在访问数据时能获得及时地响应。ide
P:分布式系统在某节点或网络分区故障时,依然能够对外提供知足CA的服务。日志
BASE(碱)理论:作不到强一致性,但应该作到最终一致性。事务
BA:基本可用。分布式系统出现故障时,容许损失部分可用性,保证核心可用。同步
S:柔性状态。容许中间态,且不影响总体可用性。如MySQL主从复制有延时,就是柔性状态的体现。it
E:最终一致性。全部数据副本通过必定时间后,最终达到一致。其必致使S。class
Paxos协议:在多机间通讯不存在伪造篡改的前提下,可经过Paxos协议达成一致性。成本是发给Paxos系统的信息,至少同步发给一半以上的机器确认后,才算成功。请求
柔性事务解决分布式事务问题:
一、引入日志和补偿机制。事物日志记录事物开始、结束状态、事务参与者信息。参与者节点根据需求作重试或回滚日志。
根据日志记录找回事务执行的当前状态,并据此决定是重试仍是回滚。实践中,其问题在于对异常处理和回滚支持不够,出了问题,人力维护的成本高。
二、可靠消息传递。
网络通讯危险期:请求发出后,响应返回前,网络发生了故障,请求方不知服务端是否已成功地处理了请求。
节点间网络通信,其结果有三:成功、失败、未知。
为保证消息传递的可靠性,消息至少发一次,有可能发屡次消息。消费者程序必须实现幂等。以前文章有述。
三、无锁。加锁会形成瓶颈,不加锁,又必须保证隔离性。
A:不回滚。事物发生异常也不回滚,经过各类补偿机制,继续走正向流程,即使中间状态对外可见。由于不回滚,也不会形成脏读。
脏读:读取未提交。
不可重复读:先后屡次读取,数据不一致。读取已提交。
幻读:先后屡次读取,数据总量不一致。
脏读和不可重复读针对的都是更新操做,幻读针对的是插入操做。
B:变化明细表。下单扣库存,不扣减商品表的库存数,而是增长一条预减记录。付款成功后再扣减商品表的库存数。付款前须要实际库存数的公式以下:
实际库存数=商品表库存数-商品预减记录的库存数总和。
C:乐观锁。版本号、时间戳。前文有述。