- 单数据库情况下对于不同表的操作可以在一个事务里,由关系数据库来保证一致性。假如要转账的两个账户正好落在了一个库里,那么可以依赖关系型数据库的事务保持强一致性(在使用以下语句时,mysql innodb引擎会自动应用行级锁:
INSERT、UPDATE、DELETE、SELECT … FOR UPDATE )(关系型数据库完全满足ACID的特性)。 - 如果要转账的两个账户正好落在了不同的库里,转账操作是无法封装在同一个数据库事务中的,这个时候会发生一个库的账户扣减余额成功,另外一个库的账户增加余额失败的情况。但拆分之后就不同了,不同的子系统都有自己的存储。比如订单中心就只管理自己的订单库,而库存管理也有自己的库。那么运营系统取消订单的时候就是通过接口调用等方式来调用订单中心和库存管理的服务了,而不是直接去操作库。这就涉及一个『分布式事务』的问题。
- 分布式锁:在单进程多线程时对同一数据的访问可以通过同步锁实现,但在多进程环境下对同一数据修改需要使用分布式锁防止数据出错.
-
- 实现方式:1. 基于数据库(使用唯一键) 2.基于缓存(redis使用setnx) 3.基于zookeeper
分布式 数据一致性
最新推荐文章于 2023-06-25 17:11:59 发布