分布式事务

Seata(Simple Extensible Autonomous Transaction Architecture)是阿里巴巴开源的分布式事务解决方案,主要支持AT、TCC、SAGA和XA四种模式。以下是各模式的工作原理:


1. ‌AT模式(自动补偿型)

核心思想‌:基于本地事务的扩展,通过代理数据源实现分支事务的自动提交和回滚。
工作流程‌:

  • 阶段一(执行)‌:
    • 主事务发起全局事务,生成XID(全局事务ID)。
    • 分支事务执行SQL时,Seata拦截SQL生成前置镜像(before image)和后置镜像(after image),保存到undo_log表。
    • 本地事务提交,但全局事务未提交时,数据处于“中间状态”(其他事务不可见)。
  • 阶段二(提交/回滚)‌:
    • 提交‌:删除undo_log记录,释放锁。
    • 回滚‌:根据undo_log的前置镜像恢复数据。

特点‌:

  • 对业务代码零侵入,依赖数据库本地事务。
  • 适合大多数CRUD场景,但需要支持本地ACID事务的数据库(如MySQL)。

2. ‌TCC模式(手动补偿型)

核心思想‌:将事务拆分为Try-Confirm-Cancel三个阶段,由开发者手动实现补偿逻辑。
工作流程‌:

  • Try‌:预留资源(如冻结账户余额)。
  • Confirm‌:确认执行业务(如扣减冻结金额)。
  • Cancel‌:取消操作并释放资源(如解冻金额)。

特点‌:

  • 需要业务代码显式实现补偿接口,灵活性高。
  • 适合需要强一致性的场景(如金融系统),但开发复杂度较高。

3. ‌SAGA模式(长事务补偿)

核心思想‌:将长事务拆分为多个本地事务,每个事务提交后触发下一个事务,失败时逆向补偿。
工作流程‌:

  • 事务执行顺序由状态机定义。
  • 成功时顺序执行,失败时逆向调用已提交事务的补偿接口。

特点‌:

  • 无锁设计,适合长流程业务(如订单+库存+物流)。
  • 补偿逻辑需幂等,可能存在“脏写”问题(最终一致性)。

4. ‌XA模式(强一致性)

核心思想‌:基于数据库的XA协议,由事务管理器协调多个资源管理器(RM)实现两阶段提交。
工作流程‌:

  • 阶段一(Prepare)‌:所有RM执行事务但不提交,返回就绪状态。
  • 阶段二(Commit/Rollback)‌:根据协调者指令提交或回滚。

特点‌:

  • 强一致性,但性能较低(依赖数据库XA支持)。
  • 适合传统数据库集成场景(如Oracle、MySQL InnoDB)。

对比总结

模式一致性侵入性适用场景
AT最终常规CRUD
TCC金融、高一致性需求
SAGA最终长流程、异步业务
XA传统数据库XA支持的环境

选择建议‌:根据业务对一致性、性能和开发成本的需求权衡选择模式。

一、如何选择事务模式?‌(决策矩阵)

模式适用场景慎用场景
AT- 常规CRUD(如更新订单+扣库存)
- 对一致性要求‌最终即可
- 希望‌零侵入‌业务代码
- 数据库支持本地事务(MySQL、PostgreSQL等)
- 高频热点数据(锁竞争激烈)
- 不支持本地事务的数据库(如MongoDB)
TCC- 金融核心系统(转账、支付)
- 需要‌强一致性
- 涉及‌非数据库操作‌(如Redis、MQ)
- 业务能接受‌手动实现补偿逻辑
- 补偿逻辑复杂的业务
- 快速迭代项目(开发成本高)
SAGA- 长流程业务(订单创建→物流→结算)
- 子事务‌执行时间长
- 需要‌异步化/并行执行
- 能接受‌最终一致性‌(补偿需幂等)
- 无法设计幂等补偿的场景
XA- 传统数据库(Oracle、MySQL InnoDB)
- 已有系统支持‌XA协议
- 强一致性且能接受‌性能损耗
- 高频事务(性能要求高)
- 云原生数据库(部分不支持XA)

二、默认模式:AT模式

  • 原因‌:
    Seata设计以‌AT模式为默认核心‌,因其:
    1. 零业务侵入‌(无需改代码,通过代理数据源自动生效)。
    2. 适用大部分场景(80%的CRUD操作)。
    3. 自动生成回滚日志(undo_log),简化开发。
  • 生效条件‌:
    引入Seata依赖后‌不显式配置事务模式‌时,默认启用AT模式。

三、指定模式的方法

在微服务中指定模式分为 ‌全局配置‌ 和 ‌单方法配置‌:

1. ‌全局配置‌(所有服务默认模式)

在 application.yml 中指定:


yamlCopy Code

seata: enabled: true data-source-proxy-mode: AT # 可选 AT / XA (代理数据源模式) client: support: # 声明全局默认模式 (AT/TCC/SAGA/XA) seataHandlerClass: io.seata.tm.api.defaultimpl.DefaultGlobalTransaction

2. ‌单方法配置‌(精细控制)

在业务方法上通过注解指定:


javaCopy Code

// AT模式(默认无需注解,显式声明可选) @GlobalTransactional // 默认使用AT模式 // TCC模式 @GlobalTransactional(type = GlobalTransactionType.TCC) // SAGA模式 @GlobalTransactional(type = GlobalTransactionType.SAGA) // XA模式 @GlobalTransactional(type = GlobalTransactionType.XA)


四、混合使用建议

复杂系统可‌组合不同模式‌:

  • 核心支付链路‌:用 TCC 保证强一致。
  • 订单创建流程‌:用 SAGA 编排库存、优惠券等异步服务。
  • 普通查询更新‌:用默认 AT 降低开发成本。
  • 传统数据库操作‌:用 XA 兼容存量系统。

⚠️ ‌关键原则‌:

  • 强一致性‌:优先选 TCC/XA。
  • 开发效率‌:无特殊要求默认用AT。
  • 长事务‌:SAGA是唯一选择。
  • 性能瓶颈‌:避免XA高频场景,TCC需优化预留资源逻辑。

通过全局配置+注解的灵活组合,可在同一系统中适配不同业务场景的事务需求。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值