详解Seata的四种事务模式:AT、TCC、SAGA、XA

article/2025/7/15 8:54:32

一、AT 模式(Auto Transaction - 默认模式

核心原理:

        基于 SQL 解析的自动补偿机制,通过代理数据源实现业务无侵入。

工作流程:

 关键特性:

  • 自动生成补偿

    • 前置镜像(Before Image):记录 SQL 执行前的数据状态。

    • 后置镜像(After Image):记录 SQL 执行后的数据状态。

      /* 前置镜像 */
      SELECT * FROM account WHERE id=1 FOR UPDATE;/* 业务操作 */
      UPDATE account SET balance=90 WHERE id=1;/* 后置镜像 */
      SELECT * FROM account WHERE id=1;
  • 全局锁机制

    • 在 TC 中维护行级锁。

    • 防止其他事务修改正在操作的数据。

适用场景:

  • 常规业务系统(电商、CRM等)。

  • 需要快速接入分布式事务的场景。

  • 对业务代码无侵入要求的项目。

二、TCC 模式(Try-Confirm-Cancel)

核心原理:

        人工编码的柔性事务,通过三个阶段实现最终一致性。

三阶段定义:

阶段职责特性
Try资源预留(冻结资金、占库存)可失败、可重试
Confirm确认操作(实际扣款、减库存)必须成功、幂等
Cancel取消操作(解冻资金、释库存)必须成功、幂等

工作流程:

 代码实现示例:

// 账户服务接口
public interface AccountService {@TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")boolean tryDeduct(BusinessActionContext context, @BusinessActionContextParameter(paramName = "userId") String userId,@BusinessActionContextParameter(paramName = "amount") BigDecimal amount);boolean confirm(BusinessActionContext context);boolean cancel(BusinessActionContext context);
}// 实现类
@Service
public class AccountServiceImpl implements AccountService {@Transactionalpublic boolean tryDeduct(BusinessActionContext context, String userId, BigDecimal amount) {// 检查余额// 冻结资金(生成冻结记录)accountDao.freeze(userId, amount);}public boolean confirm(BusinessActionContext context) {// 获取冻结金额BigDecimal amount = (BigDecimal)context.getActionContext("amount");// 实际扣除冻结资金accountDao.deductFrozen(userId, amount);}public boolean cancel(BusinessActionContext context) {// 释放冻结资金accountDao.unfreeze(userId, amount);}
}

设计要点:

  • 幂等控制

    • 通过事务上下文(XID + Branch ID)确保操作幂等。

  • 空回滚防护

    • 检查 Try 是否已执行。

  • 悬挂处理

    • Cancel 比 Try 先到时拒绝执行。

适用场景:

  • 金融支付系统。

  • 需要精准控制事务流程的业务。

  • 高并发资金操作(如红包系统)。

三、SAGA 模式

核心原理:

        长事务解决方案,通过事务编排 + 补偿服务实现最终一致性

两种实现方式:

类型实现方式特点
状态机基于配置的状态转移可视化编排、集中管理
注解驱动@SagaService注解代码集成、灵活性高

 状态机配置示例:

{"name": "orderSaga","steps": [{"name": "reduceInventory","service": "inventoryService","compensate": "compensateInventory"},{"name": "deductBalance","service": "accountService","compensate": "compensateDeduction"}],"failurePolicy": "forward" // 补偿策略
}

补偿策略:

策略执行方式适用场景
正向恢复重试失败步骤临时性错误(网络抖动)
逆向恢复执行所有补偿操作业务逻辑错误
自定义策略根据错误类型选择策略复杂业务场景

工作流程:

 适用场景:

  • 跨系统业务流程(订单→物流→支付)。

  • 长时间运行的事务(保险理赔、贷款审批)。

  • 遗留系统改造(不需要全局事务支持)。

四、XA 模式

核心原理:

        基于数据库原生XA协议,实现强一致性分布式事务。

两阶段提交:

阶段操作资源状态
Prepare所有参与者执行事务但不提交锁定资源
Commit协调者通知所有参与者提交事务释放锁,持久化

 代码示例:

@GlobalTransactional(type = GlobalTransactionType.XA)
public void xaTransaction() {jdbcTemplateXA1.execute("UPDATE account SET balance=90 WHERE id=1");jdbcTemplateXA2.execute("INSERT INTO log(user_id,action) VALUES(1,'payment')");
}

关键配置:

# 启用XA模式
seata.data-source-proxy-mode=XA
# 超时设置(秒)
seata.tx-service.xa.timeout=30

适用场景:

  • 传统数据库迁移到分布式架构。

  • 需要强一致性的核心系统(银行核心)。

  • 已有支持XA协议的数据库系统。

五、模式选择决策树

六、混合模式实战案例

电商订单系统

  • 主流事务(AT模式)

    @GlobalTransactional
    public void createOrder(OrderDTO order) {// AT模式操作inventoryService.deductStock(order); accountService.deductBalance(order);// TCC模式操作(积分服务)pointsService.addPoints(order.getUserId(), order.getPoints());// 本地事务orderDAO.create(order);
    }
  • 积分服务(TCC模式)

    @TwoPhaseBusinessAction(name = "addPoints")
    public boolean tryAddPoints(BusinessActionContext context, @BusinessActionContextParameter("userId") Long userId,@BusinessActionContextParameter("points") Integer points) {// 预加积分(生成预加记录)
    }

 七、性能对比

指标AT模式TCC模式SAGA模式XA模式
吞吐量10,000 TPS8,000 TPS7,000 TPS2,000 TPS
平均延迟50ms80ms100ms+200ms+
锁持有时间极短(本地提交后释放)中等(Confirm前)长(整个事务周期)长(两阶段结束)
数据一致性最终一致最终一致最终一致强一致
业务侵入性

 八、选型建议

  • 首选 AT 模式

    • 新项目快速接入

    • 常规业务场景

    • 开发资源有限的项目

  • 考虑 TCC 模式

    • 金融核心系统

    • 需要精确控制事务流程

    • 高并发资金操作

  • 选择 SAGA 模式

    • 跨企业服务调用

    • 长周期业务流程

    • 遗留系统集成

  • 使用 XA 模式

    • 强一致性要求的系统

    • 已有XA基础设施

    • 数据库支持XA协议

重要提示:生产环境建议结合 Sentinel 或 Hystrix 实现事务熔断,防止雪崩效应。对于金融级场景,建议采用 TCC+AT 混合模式,关键资金操作使用TCC,辅助操作使用AT。


http://www.hkcw.cn/article/FhUOQlcgxD.shtml

相关文章

【MySQL系列05】构建99.999%高可用MySQL: 从主从复制到企业级集群架构详解

关键词: MySQL高可用架构、主从复制、读写分离、故障转移、MySQL集群、InnoDB Cluster、Percona XtraDB、MySQL Router、ProxySQL、数据库容灾 摘要: 本文从生活化的超市收银员比喻出发,深入浅出地讲解MySQL高可用架构的构建方法。从基础的主…

力扣刷题Day 65:单词搜索(79)

1.题目描述 2.思路 方法1(自己写的深度优先的回溯方法):遍历网格,每走过一格都将其坐标加入visited集合,然后向上、下、左、右四个方向查找可行路径,如果找到可行路径则一路向下延伸查找,如不可…

多卡训练核心技术详解

多卡训练核心技术详解 多卡训练 主要围绕分布式环境初始化、模型并行化、数据分片和梯度同步展开。下面结合您的代码,详细解释这些核心部分: 并行执行命令 torchrun --nproc_per_node=5 TokenLossMulCard.py 1. 分布式环境初始化 def init_distributed():init_process_…

PDT经理的角色认知

PDT团队 在IPD体系导入过程中,PDT经理(又称LPDT,Leader of Product Development Team)是最关键的角色之一,本篇文章中汉捷咨询就PDT经理的角色认知进行探讨。要认识PDT经理首先需要认识PDT,PDT&#xff08…

历年浙江大学计算机保研上机真题

2025浙江大学计算机保研上机真题 2024浙江大学计算机保研上机真题 2023浙江大学计算机保研上机真题 在线测评链接:https://pgcode.cn/school?classification1 最小包围矩形 题目描述 给定一系列二维平面点的坐标 ( x , y ) (x, y) (x,y),其中 x x…

BKP(备份寄存器)和 RTC(实时时钟)

什么是BKP? 备份寄存器(BackupRegister)是42个16位的寄存器(不同设备存在差异:20字节(中容量和小容量)/84字节(大容量和互联型)),可用来存储 最多…

antDesignVue中a-upload上传组件的使用

工作中需要使用上传组件,记录一下a-upload部分属性用法 1.showUploadList属性使用 使用:showUploadList"{ showRemoveIcon: true ,showDownloadIcon: true }"属性可控制右侧下载,删除图标 2.如何实现回显功能 使用:defaultFileList"fil…

基于RK3568/RK3588/全志H3/飞腾芯片/音视频通话程序/语音对讲/视频对讲/实时性好/极低延迟

一、前言说明 近期收到几个需求都是做音视频通话,很多人会选择用webrtc的方案,这个当然是个不错的方案,但是依赖的东西太多,而且相关组件代码量很大,开发难度大。所以最终选择自己属性的方案,那就是推流拉…

借助DS用python帮你编写脚本(辅助开发测试)

最近在做一个音频采集识别项目,采集20HZ到20KHZ各个频带最大分贝数(DB),需要用到各个频段的测试音频来验证程序的正确性。 借助Deepseek,原本对python编程没有学过,也能轻松学会。 提问:pytho…

【图像处理基石】如何进行图像畸变校正?

图像畸变校正常用于计算机视觉、摄影测量学和机器人导航等领域,能够修正因镜头光学特性或传感器排列问题导致的图像失真。下面我将介绍几种常用的图像畸变校正算法,并提供Python实现和测试用例。 常用算法及Python实现 1. 径向畸变校正 径向畸变是最常…

技术创新如何赋能音视频直播行业?

在全球音视频直播行业的快速发展中,技术的持续创新始终是推动行业进步的核心动力。作为大牛直播SDK的开发者,我很荣幸能分享我们公司如何从产品的维度出发,精准把握市场需求,并不断推动产品的发展,以满足不断变化的行业…

我的世界服务端搭建

文章目录 我的世界服务端搭建使用forge搭建服务端确保服务器的 Java 环境安装1.20.1服务端配置文件修改启动游戏服务器 Minecraft server.properties 文件解析**基础设置****世界设置****网络与安全****性能优化****高级功能****配置文件示例****注意事项**Minecraft 白名单系统…

官宣正式分手 特朗普马斯克说了什么临别感言

官宣正式“分手” 特朗普马斯克都说了什么“临别感言”当地时间5月30日,美国总统特朗普和美国企业家、政府效率部负责人埃隆马斯克在白宫举行新闻发布会。特朗普称赞“政府效率部”成就在发布会上,特朗普对马斯克领导的“政府效率部”所达成的成就表示称赞,他称“政府效率部…

STM32通过rt_hw_hard_fault_exception中的LR寄存器追溯程序问题​

1. 问题现象 程序运行导致rt_hw_hard_fault_exception 如图 显示错误相关代码 struct exception_stack_frame {uint32_t r0;uint32_t r1;uint32_t r2;uint32_t r3;uint32_t r12; uint32_t lr; // 链接寄存器 (LR)uint32_t pc; // 程序计数器 (PC)uint32_t psr; // 程序状态…

AgenticSeek,开源本地通用AI Agent,自主执行任务

AgenticSeek是一款完全本地化的开源AI助手,作为Manus的开源替代品,专为保护用户隐私而设计。它能够在本地设备上执行多种任务,包括网页浏览、代码编写和复杂项目的规划,确保所有操作和数据均在用户的设备上完成。 AgenticSeek是什…

深入理解 Java 反射机制:动态编程的核心利器

一、反射机制的本质与核心价值 在 Java 的世界里,反射机制(Reflection)被视为连接静态编译与动态执行的桥梁。当程序运行时,反射允许我们在内存中动态获取类的完整结构信息,并对类的成员(字段、方法、构造…

群晖synology nas安装curl教程

在群晖nas系统上发现没有curl这个命令,想通过opkg进行安装,发现opkg这个套件也没有,本章教程介绍如何安装opkg,并通过opkg 安装上curl命令工具,nas的系统版本是:x86_64 GNU/Linux synology_apollolake_918+ 一、安装opkg wget -O - http://bin.entware.net/x64-k3.2/inst…

非接触式数据引擎:RFID重塑锂电注液工艺实时交互生态

非接触式数据引擎:RFID重塑锂电注液工艺实时交互生态 浙江某锂电行业注液机上存在问题: 1.在锂电池制造的核心环节中,注液工艺直接影响电芯的电化学性能与安全稳定性。随着行业对电池一致性、生产效率及追溯能力的需求升级。 2.按设定的抽…

Shell基础命令

一、设置修改主机名称 1.文件方式(重启生效) 2.命令方式(立即生效) hostnamectl set-hostname myname 二、网络管理nmcli (NetworkManager command-line interface) nmcli 1、查看网卡 2、设置网卡 dhcp网络工作模式 静态网…

【JVM】Java程序运行时数据区

运行时数据区 运行时数据区是Java程序执行过程中管理的内存区域 Java 运行时数据区组成(JVM 内存结构) Java 虚拟机(JVM)的运行时数据区由以下核心部分组成: 线程私有:程序计数器、Java虚拟机栈、本地方…