分布式事务方案对比
分布式事务是微服务架构最难的问题之一。从 XA 到 TCC 到 Saga,5 种方案各有千秋,怎么选?
一、分布式事务的理论基础
- 1.1 CAP 理论——分布式事务最多满足两个
- 1.2 BASE 理论——最终一致性的哲学
- 1.3 刚性事务 vs 柔性事务
二、方案 1:XA 两阶段提交
- 2.1 两阶段提交的流程——Prepare → Commit
- 2.2 优点——强一致性
- 2.3 缺点——同步阻塞、单点故障、数据不一致风险
- 2.4 适用场景——单块应用中的多数据源
三、方案 2:TCC(Try-Confirm-Cancel)
- 3.1 Try——资源预留
- 3.2 Confirm——确认执行
- 3.3 Cancel——回滚释放
- 3.4 优缺点——业务侵入性强,但性能好
- 3.5 适用场景——资金转账等要求强一致性的场景
四、方案 3:Seata AT 模式
- 4.1 AT = 自动化的 TCC——一阶段自动提交 + 二阶段回滚
- 4.2 undo_log 回滚日志——反向 SQL
- 4.3 全局锁——写隔离
- 4.4 读已提交隔离级别
- 4.5 优缺点——业务无侵入,但有性能损耗
五、方案 4:Saga 模式
- 5.1 Saga = 长事务的补偿
- 5.2 正向操作 + 逆向补偿
- 5.3 Seata Saga 状态机——JSON DSL 编排
- 5.4 适用场景——业务流程长、无法加锁的场景
六、方案 5:本地消息表 / 事务消息
- 6.1 本地消息表——同库存储 + 定时轮询
- 6.2 RocketMQ 事务消息——half 消息机制
- 6.3 适用场景——异步解耦场景
七、方案选型决策树
- 7.1 是否需要强一致性 → TCC / XA
- 7.2 能否接受业务侵入 → TCC / Saga
- 7.3 是否长流程 → Saga
- 7.4 是否异步解耦 → 事务消息
- 7.5 默认选择 → Seata AT / 本地消息表
八、总结
- 没有银弹,每个方案都是 trade-off
- 实际项目中往往是多种方案的组合
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!