Skip to content

分布式事务解决方案

一、核心背景:什么是分布式事务?

1. 定义

在微服务架构中,一次业务操作可能跨多个服务、多个数据库,需要保证所有分支操作要么全部成功,要么全部失败,这种跨节点的事务就是分布式事务。

2. 理论基础

基于CAP定理和BASE理论,分布式事务无法同时满足强一致性和高可用性,主流方案分为:

  • CP模式:强一致性优先,牺牲部分可用性(如Seata XA模式)
  • AP模式:高可用性优先,保证最终一致性(如Seata AT、TCC模式,MQ异步方案)

二、Seata 分布式事务框架

1. 核心架构角色

  • TC(Transaction Coordinator)事务协调者:维护全局和分支事务状态,协调全局事务提交或回滚。
  • TM(Transaction Manager)事务管理器:定义全局事务范围,开启、提交或回滚全局事务。
  • RM(Resource Manager)资源管理器:管理分支事务资源,与TC通信注册、报告分支事务状态,驱动分支事务提交或回滚。

2. XA 模式(CP 强一致)

原理

两阶段提交协议实现,强一致性优先:

  • 第一阶段:各分支事务注册到TC,执行SQL但不提交,锁定资源并报告状态。
  • 第二阶段:TC检测所有分支状态,全部成功则通知RM提交事务;任一失败则通知所有RM回滚事务。

特点

  • 优点:保证强一致性,数据无脏写。
  • 缺点:资源锁定周期长,性能较差,适用于银行业务等强一致场景。

3. AT 模式(AP 最终一致)

原理

在XA基础上优化,通过Undo Log实现无锁事务:

  • 第一阶段:RM注册分支事务,记录数据更新前后快照(Undo Log),执行业务SQL并提交本地事务,释放资源后报告状态给TC。
  • 第二阶段:TC通知提交时,RM直接删除Undo Log;通知回滚时,RM根据Undo Log恢复数据到更新前状态。

特点

  • 优点:资源锁定时间短,性能好,适合互联网业务场景。
  • 缺点:依赖数据库快照机制,部分数据库兼容性有限。

4. TCC 模式(AP 最终一致)

原理

三阶段提交,完全由业务层实现:

  • Try(资源检测与预留):检查资源状态,预留资源(如冻结金额、锁定库存)。
  • Confirm(业务确认):Try阶段成功后,执行实际业务操作,完成资源扣减。
  • Cancel(资源释放):Try阶段失败或全局事务回滚时,释放预留资源,恢复数据状态。

特点

  • 优点:性能较好,无数据库锁依赖,适合对一致性要求高的场景。
  • 缺点:需要人工编码实现Try/Confirm/Cancel三个接口,开发成本高。

三、MQ 异步事务方案(AP 最终一致)

原理

基于消息队列实现最终一致性:

  1. 主服务在本地事务中完成业务操作,并同步发送消息到MQ(同事务执行)。
  2. 下游服务监听MQ消息,消费消息并执行本地事务。
  3. 若下游执行失败,可通过重试机制、死信队列补偿,最终保证数据一致。

特点

  • 优点:异步执行,性能最好,系统解耦度高,适合高并发互联网业务。
  • 缺点:无法保证强一致性,依赖消息队列可靠性,需处理消息丢失、重复消费问题。

四、主流方案对比与选型

方案一致性可用性性能开发成本适用场景
Seata XA强一致(CP)较低银行业务、金融交易
Seata AT最终一致(AP)电商、订单等互联网业务
Seata TCC最终一致(AP)较好复杂业务、强一致性要求场景
MQ异步方案最终一致(AP)最好高并发、非强一致业务

五、面试相关问题

  1. 问:项目中使用过什么分布式事务解决方案?答: 项目中采用了Seata AT模式作为主要方案,结合业务场景选择了最终一致性模型。Seata的AT模式基于Undo Log实现,资源锁定周期短,性能表现良好,能够满足电商订单、库存扣减等跨服务写操作的一致性需求。

  2. 问:Seata的AT模式和XA模式有什么区别?答: XA模式是两阶段提交的传统实现,保证强一致性但资源锁定时间长,性能较差;AT模式通过Undo Log实现无锁事务,在第一阶段就提交本地事务并释放资源,第二阶段通过日志完成提交或回滚,性能更好,更适合互联网业务场景。

  3. 问:TCC模式的三个阶段分别是什么?答: TCC模式分为Try、Confirm、Cancel三个阶段:Try阶段进行资源检测与预留;Confirm阶段执行实际业务操作;Cancel阶段释放预留资源、恢复数据状态。该模式需要业务层实现三个接口,开发成本较高,但性能和一致性表现较好。

  4. 问:MQ异步事务方案如何保证最终一致性?答: 主服务在本地事务中完成业务操作并同步发送消息到MQ,下游服务消费消息执行本地事务;若下游执行失败,可通过重试机制、死信队列进行补偿,最终保证上下游数据一致。该方案性能最好,但无法保证强一致性,适合高并发非强一致场景。

Powered by VitePress 1.6.4 | 持续更新中