Yihui’s Blog

如何实现分布式事务补偿?补偿失败怎么办?

日期:2026-07-12
标签:#面试 #八股 #后端 #分布式事务 #补偿 #系统设计

一句话答案

每个正向步骤必须预先定义可幂等、可重试、可审计的反向业务动作;补偿由持久状态机驱动,失败分类重试,超过阈值进入对账和人工处理,不能静默结束。

面试口语版

补偿不是数据库 rollback,而是新的业务事务。例如库存预占的补偿是释放,支付成功后的补偿可能是退款。Saga 日志记录步骤、输入、版本、状态和补偿顺序,通常按正向步骤逆序执行。每个补偿使用原业务 ID 加补偿类型做唯一键,先查询状态再执行,处理重复、空补偿和悬挂。临时错误指数退避重试,永久错误立即告警;多次失败进入人工工单,冻结相关资源并持续对账。补偿期间原业务状态必须显示处理中,不能对外宣称完成。

关键细节

  • 补偿可能不可完全恢复原状,例如退款不能收回已发通知。
  • 设置最大自动重试时间,不是达到次数就丢弃。
  • 正向与补偿事件都需可靠持久化和审计。
  • 人工处理后也要通过系统状态机闭环,避免账实不符。

面试官追问

  1. 什么是空补偿和悬挂?
  2. 补偿操作如何保证幂等?
  3. 永久补偿失败怎么办?

面试官追问参考答案

1. 什么是空补偿和悬挂?

空补偿是正向 Try 未执行或结果未知时先收到 Cancel,补偿应安全返回;悬挂是 Cancel 已完成后迟到的 Try 又执行。服务记录事务分支状态,拒绝已取消分支的后续正向操作。

2. 补偿操作如何保证幂等?

以全局事务 ID、分支 ID 和补偿类型建立唯一记录,使用条件状态转换;重复请求返回已有结果。资源变更与补偿流水在同一本地事务中提交。

3. 永久补偿失败怎么办?

进入高优先级告警和人工工单,冻结订单/资金避免继续演进,通过渠道查询、对账和审批处理。保留证据和 SLA,人工完成后写回同一状态机并复核,绝不删除失败记录。

学习清单

  • 理解补偿是业务事务而非回滚。
  • 掌握幂等、空补偿、悬挂和人工闭环。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts