您的位置:首页 > 其它

分布式事务一致性

2021-01-23 22:15 621 查看

数据库ACID(酸):原子性,一致性,隔离性,持久性。

CAP理论:一个分布式系统最多能满足一致性C,可用性A,分区容错性P,三项中的两个。

C:更新操作成功且返回请求方完成后,所有节点在同一时间的数据完全一致。

A:用户在访问数据时能得到及时地响应。

P:分布式系统在某节点或网络分区故障时,依然可以对外提供满足CA的服务。

BASE(碱)理论:做不到强一致性,但应该做到最终一致性。

BA:基本可用。分布式系统出现故障时,允许损失部分可用性,保证核心可用。

S:柔性状态。允许中间态,且不影响整体可用性。如MySQL主从复制有延时,就是柔性状态的体现。

E:最终一致性。所有数据副本经过一定时间后,最终达到一致。其必导致S。

Paxos协议:在多机间通信不存在伪造篡改的前提下,可通过Paxos协议达成一致性。成本是发给Paxos系统的信息,至少同步发给一半以上的机器确认后,才算成功。

柔性事务解决分布式事务问题:

1、引入日志和补偿机制。事物日志记录事物开始、结束状态、事务参与者信息。参与者节点根据需求做重试或回滚日志。

根据日志记录找回事务执行的当前状态,并据此决定是重试还是回滚。实践中,其问题在于对异常处理和回滚支持不够,出了问题,人力维护的成本高。

2、可靠消息传递。

网络通信危险期:请求发出后,响应返回前,网络发生了故障,请求方不知服务端是否已成功地处理了请求。

节点间网络通讯,其结果有三:成功、失败、未知。

为保证消息传递的可靠性,消息至少发一次,有可能发多次消息。消费者程序必须实现幂等。之前文章有述。

3、无锁。加锁会造成瓶颈,不加锁,又必须保证隔离性。

A:不回滚。事物发生异常也不回滚,通过各种补偿机制,继续走正向流程,即便中间状态对外可见。因为不回滚,也不会造成脏读。

脏读:读取未提交。

不可重复读:前后多次读取,数据不一致。读取已提交。

幻读:前后多次读取,数据总量不一致。

脏读和不可重复读针对的都是更新操作,幻读针对的是插入操作。

B:变化明细表。下单扣库存,不扣减商品表的库存数,而是增加一条预减记录。付款成功后再扣减商品表的库存数。付款前需要实际库存数的公式如下:

实际库存数=商品表库存数-商品预减记录的库存数总和。

C:乐观锁。版本号、时间戳。前文有述。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: