对分布式事务的一些思考
· 阅读需 16 分钟
要求
阅读这篇文章之前,需要对以下知识点有所了解~
- BASE 理论
- 事务的概念
- 分布式架构
1. 什么是分布式事务
是指在分布式系统中,事务的参与者、支持该事务的服务器、资源管理器和事务管理器分别位于不同的分布式节点之上。一个分布式事务通常涉及多个操作,这些操作可能跨越多个不同的数据库系统或服务,并且需要保证所有操作要么全部成功执行,要么全部不执行(即保持事务的原子性)。
例如:xx 电商系统的交易系统,承担用户下单功能;当用户对商品 A 进行购买的时候,假设商品 A 不允许超卖的场景,需要执行下面几个步骤:
- 检查库存:当用户提交订单时,系统首先调用库存服务检查所需商品是否有足够的库存。
- 锁定库存:如果库存充足,库存服务将临时锁定这些商品的数量,防止其他订单同时购买导致超卖。
- 检查积分:当用户选择使用积分抵扣现金时,系统需要调用积分服务检查用户是否有足够的积分进行抵扣。
- 锁定积分:如果积分充足,积分服务将临时锁定用户选择抵扣的积分数量,防止其他订单同时使用这份积分。
- 创建订单:订单服务创建一个新的订单记录,并设置订单状态为“待支付”。
- 发起支付:系统调用第三方支付网关交互以完成实际的支付过程。
- 确认支付并减少库存:支付成功后,系统通知库存服务正式减少商品库存,通知积分服务正式减少可使用积分,并更新订单状态为“已支付”。
涉及的服务有:
- 库存服务:负责管理商品的库存。
- 订单服务:负责处理用户的订单创建和对接第三方支付流程。
- 积分服务:负责处理用户的积分抵扣逻辑。
如果这些服务都是部署在同一台机器上,那就可以使用本地事务轻松控制一致性;但实际上述服务可能跑在不同的服务上,如下图所示:

不同的服务部署在不同的节点上,节点之间通过 RPC 进行通讯;回到用户购买商品 A 这个流程,每个步骤都是由不同的服务执行的,用户想要购买成功,上述 5 个步骤都需要执行成功,如果任何一个步骤失败(例如库存不足、积分不足),那失败之前的步骤都需要进行回滚,例如锁定积分失败,那就需要将原本锁定成功的库存给释放掉,避免资源被长时间占用;
即用户购买商品的整个行为要么成功、要么失败。
2. TCC 是什么
即 Try-Confirm-Cancel,分布式事务的其中一种实现方式,是基于补偿机制实现的最终一致性;体现了 BASE 理论的一种实现方式;
