分布式事务实战手册:从最终一致到TCC、Saga、消息事务,把跨服务的数据一致性一次做对

订单服务扣了库存,支付服务扣了款,结果积分服务挂了——用户付了钱,积分没到账。这类问题几乎每个做过微服务的人都会遇到一次。

很多人的第一反应是"上分布式事务框架"。但真正动起来才发现,分布式事务不是一个方案,而是一组方案,从"什么都不做靠对账兜底"到"严格两阶段提交",复杂度和性能差了一个数量级。选重了系统被拖垮,选轻了数据不一致没人发现。

本文按成本从低到高的顺序,把六种落地方案、它们的适用边界、以及三个绕不开的地基问题(幂等、可靠投递、对账)一次讲清楚。


零、先分清你面对的是哪一种"不一致"

动手之前先给问题分类,这一步能直接砍掉一半的过度设计。

第一类:本地事务 + 外部调用 例如下单后要调短信服务通知用户。短信发没发成功,不影响订单本身的正确性。这类不需要分布式事务,本地事务提交后异步调用,失败重试即可。

第二类:跨服务的业务数据必须一致 例如扣库存和创建订单必须在结果上要么都成、要么都不成。这是真正需要处理的一类,也是本文的重点。

第三类:跨库但同一次操作 例如同一个服务里写两个数据库。这类可以用 XA,或者干脆拆成一个库。

第四类:已经不一致了,要能发现并修 这是兜底,不是方案——但任何方案都必须

内容摘要

一句话概述:订单扣了库存、支付扣了款,结果积分服务挂了——用户付了钱,积分没到账。这类跨服务不一致几乎每个微服务团队都会遇到,但分布式事务不是"上框架"就能解决的,选重了系统被拖垮,选轻了不一致没人发现。

核心要点:

  • 先把不一致分成四类,这一步能砍掉一半的过度设计
  • 六种方案按成本排序:本地消息表、事务消息、TCC、Saga、对账兜底、XA
  • 本地消息表 + 可靠投递是最实用的首选,覆盖八成业务场景
  • TCC 的三个必答问题:空回滚、幂等、悬挂,以及各自的防护做法
  • 幂等的四种实现与幂等键的生命周期管理,是所有方案的地基
  • 五个最容易踩的坑与八项上线检查:补偿的补偿、超时放大、可观测性

适合人群:正在落地微服务的中后端工程师与架构师,以及需要评估一致性改造投入的技术负责人。

以上为全文要点速览,完整内容需解锁后阅读

🔒 付费文档

支付 5 积分后即可解锁全部内容