分布式事物

好的,分布式事务是分布式系统中的核心难点之一,XA、AT(Auto Transaction)和TCC(Try-Confirm-Cancel)是三种常见的解决方案。以下是它们的原理和流程对比:


一、 XA 事务(两阶段提交协议)

适用场景:传统数据库层的强一致性事务,依赖数据库原生支持(如MySQL XA协议)。

原理

两阶段提交(2PC)

  1. Prepare Phase(准备阶段)
    ◦ 事务管理器(TM)向所有参与者(资源管理器,RM)发送"预提交"请求。
    ◦ 参与者执行事务操作,记录undo/redo日志,锁定资源,返回"就绪"或"失败"。
  2. Commit Phase(提交阶段)
    ◦ 若所有参与者返回"就绪",TM发送"提交"命令,参与者持久化数据并释放锁。
    ◦ 若任一参与者返回"失败",TM发送"回滚"命令,参与者撤销操作。
流程示例
plaintext 复制代码
TM → RM1: Prepare
TM → RM2: Prepare
RM1 → TM: Ready
RM2 → TM: Ready
TM → RM1: Commit
TM → RM2: Commit
优缺点

优点 :强一致性,数据库原生支持。

缺点

• 性能差(同步阻塞、锁竞争)。

• 单点故障(TM宕机可能导致资源长期锁定)。

• 不适用于高并发或长事务场景。


二、 AT 事务(自动补偿型)

适用场景:Seata框架提出的模式,适用于微服务架构,通过本地事务+全局锁实现弱侵入性。

原理

核心机制

  1. 全局锁:在业务表上记录全局锁,防止其他事务修改相同数据。
  2. 本地事务:每个分支事务提交时自动生成回滚日志(undo log)。
  3. 补偿机制:若事务失败,通过undo log回滚数据。
流程
  1. 阶段一(提交)
    • 业务SQL执行前,记录数据快照(undo log)。
    • 执行业务SQL,提交本地事务,释放本地锁(但保留全局锁)。
  2. 阶段二(提交/回滚)
    • 若全局事务成功,异步删除undo log。
    • 若全局事务失败,根据undo log生成反向SQL补偿数据。
优缺点

优点

• 无侵入性(仅需代理数据源)。

• 性能优于XA(无全局锁等待)。

缺点

• 全局锁可能引发脏写(需业务隔离级别支持)。

• 无法处理非SQL操作(如Redis、MQ)。


三、 TCC 事务(补偿型)

适用场景:需要业务高度可控的场景(如金融交易),通过业务代码实现补偿逻辑。

原理

三阶段模型

  1. Try 阶段:预留资源(如冻结账户余额),记录中间状态。
  2. Confirm 阶段:提交事务,确认资源操作(如扣减冻结金额)。
  3. Cancel 阶段:回滚事务,释放预留资源(如解冻金额)。
流程示例
plaintext 复制代码
订单服务 → Try: 创建订单(状态:待确认)
库存服务 → Try: 冻结库存(库存数-1,冻结数+1)

-- 若所有Try成功 --
订单服务 → Confirm: 订单状态改为"已确认"
库存服务 → Confirm: 冻结库存数-1,实际库存数不变

-- 若任一Try失败 --
订单服务 → Cancel: 删除订单
库存服务 → Cancel: 库存数+1,冻结数-1
关键要求

幂等性 :Confirm/Cancel需支持重复调用。

防悬挂:需处理Try成功但未收到Confirm/Cancel的场景(如超时控制)。

优缺点

优点

• 灵活性高,可处理非SQL操作。

• 性能较好(无全局锁)。

缺点

• 业务侵入性强(需实现Try/Confirm/Cancel接口)。

• 开发复杂度高(需处理所有异常分支)。


四、 对比总结

方案 一致性 性能 侵入性 适用场景
XA 强一致 传统数据库事务
AT 最终一致 微服务+SQL场景
TCC 最终一致 金融等高可靠性业务

五、 选型建议

  1. XA:适合强一致性的简单事务(如跨库转账),但对性能要求不高。
  2. AT:适合微服务架构下的SQL操作(如电商下单),平衡性能与侵入性。
  3. TCC:适合复杂业务(如支付、库存扣减),需精细化控制补偿逻辑。

通过结合业务需求(一致性、性能、开发成本)选择合适方案,必要时可混合使用(如TCC+AT)。

相关推荐
风吹夏回12 天前
RabbitMQ 核心术语 + Python pika 方法完整讲解
分布式·python·rabbitmq
风吹夏回12 天前
RabbitMQ 三种模式入门:HelloWorld、WorkQueue、PubSub
分布式·rabbitmq·ruby
霸道流氓气质12 天前
分布式追踪与 RequestId 传播完全指南
分布式
cheems952712 天前
[RabbitMQ高级特性] 消息确认机制:从 Ready / Unacked 到 basicAck、basicReject、basicNack 的底层拆解
分布式·rabbitmq·ruby
枫华落尽12 天前
【Hadoop01-完全分布式运行模式】
分布式
隔壁阿布都12 天前
ShedLock 分布式定时任务锁框架介绍
spring boot·分布式
文艺倾年12 天前
【强化学习】数学推导专题,20W字总结(十五)
人工智能·分布式·大模型·强化学习·vibecoding
ACP广源盛1392462567312 天前
GSV9001S@ACP#1080P 级视频处理芯片,物理 AI 普及终端的高性价比选择
大数据·人工智能·分布式·嵌入式硬件·spark
guslegend12 天前
第1章:初始Kafka
分布式·kafka
ACP广源盛1392462567313 天前
GSV5600@ACP#多接口协议转换芯片,物理 AI 便携终端的互联核心
大数据·人工智能·分布式·嵌入式硬件·spark