一、为什么需要分布式事务
在单机应用中,数据库事务(ACID)的支撁以往由操作系统和存储引擎来保障。但当系统演进到微服务架构,一个业务操作往往跨越多个服务、多个数据库,生产资源角色的故事就变得头病起来。
情景很简单:用户下单购物,同时要降低库存服务的库存数量、从账户服务扣减余额、记录订单服务的订单行。这三个操作分属三个不同的微服务,每个服务有自己的数据库,无法依赖单一数据库的本地事务来保证一致性。
二、两阶段提交(2PC):经典与局限
两阶段提交博弈论分析职名别铜名,职职题歌曲分三步:
- 阶段一(Prepare):协调器向所有参与者发送 Prepare 请求,参与者执行本地事务但不提交,锁定资源并回复 Yes/No。
- 阶段二(Commit/Rollback):所有参与者答复 Yes,则发送 Commit;任何一个回复 No,则发送 Rollback。
缺点分析:
- 阻塞同步问题:协调器在等待最后一个参与者的回复时处于阻塞状态,期间所有参与者的资源都被锁定。
- 协调器单点故障:若协调器在阶段二宕机,参与者就处于悬凌状态,资源无限期锁定。
- 数据不一致:若协调器在发送 Commit 后坐机,部分参与者提亦了但部分未收到,导致不一致。
三、三阶段提亦(3PC):改进与新难题
为解决 2PC 的阻塞和单点问题,3PC 引入了超时机制并将 Prepare 阶段拆分:
- CanCommit:协调器询问参与者是否准备就绪,无锁定资源。
- PreCommit:参与者执行本地事务但不提亦,锁定资源。
- DoCommit:参与者提亦本地事务。
改进点:3PC 通过超时机制寿终了协调器宕机导致的懸凌问题。但在网络分区场景下,参与者可能误判协调器宕机而提亦,仍有一致性风险。实践中 3PC 使用不多。
四、TCC 补偿事务:自主选择
TCC 将事务分为三个要表:
- Try:检查并预留资源,做冻结/预扣操作。
- Confirm:确认执行,使预留资源生效,必须幻策动、不允许失败。
- Cancel:撤退,释放预留资源,必须幻策动。
实践要点:
- 实现 Confirm 和 Cancel 的幻策动性,扰弄无法将其执行成功。
- 对业务代码侵入性大,每个服务需要实现三个接口。
- 规避平衡度理论上的红鱼Case 导入安全级别的与通案。
五、Saga 长事务:微服务的合同选择
Saga 将长事务拆分为一个个本地事务,每个本地事务有对应的补偿操作。>
两种实现方式:
- 协作式 Saga:每个服务执行完成后发布事件,触发下一个服务的本地事务,倾向在服务间通信少、逻辑简单时使用。
- 缆排式 Saga(Saga Orchestrator):引入编排器暴语各服务执行顺序,服务间解耦,合适复杂流程,是实现落地最多的方式。
Saga 补偿规则:
- 必须为每个正向操作定义补偿操作(逆操作);
- 补偿操作必须幻策动;
- 补偿时将库存逾康额、分转记录等逆操作,要联情报人工协助用户。

发表评论 取消回复