Seata AT 模式是分布式事务的改进型两阶段提交方案,通过自动代理数据源、解析业务 SQL 并生成 undo_log 回滚日志,实现零业务侵入的分布式事务管理,是微服务场景中最常用的分布式事务方案。
图示中服务 A、服务 B 代表微服务节点,事务协调者负责全局事务调度,资源管理器负责分支事务的提交与回滚,undo_log 是保障事务原子性的核心载体。

开启全局事务:分布式事务发起方(如服务 A)通过 @GlobalTransactional 注解开启全局事务,Seata 生成唯一全局事务 ID(XID)
调用分支事务:服务 A 远程调用服务 B 接口,XID 自动透传,服务 B 成为分支事务参与者
注册分支事务:服务 A、服务 B 向事务协调者(TC) 注册分支事务,纳入全局事务管理
执行业务 SQL:代理数据源拦截业务 SQL,执行本地事务并自动提交,同时生成 undo_log 回滚日志存入数据库
上报事务状态:所有分支服务向 TC 上报本地事务执行结果
全局决策:TC 根据全部分支状态,决定全局事务提交或回滚
全局提交:异步通知各服务删除 undo_log
全局回滚:通知各服务通过 undo_log 执行数据回滚
接收 TC 指令,完成提交(删除日志)或回滚(执行日志)操作,TC 会定时校验分支事务状态保证一致性
Seata AT 模式的核心设计:代理数据源解析 SQL + 自动生成 undo_log,全程无业务代码侵入,两阶段流程清晰:
第一阶段:开启全局事务 → 注册分支 → 执行业务 SQL → 本地提交 → 生成 undo_log
第二阶段:全局成功 → 异步删除 undo_log;全局失败 → 执行 undo_log 回滚数据
相比 XA 模式,AT 模式无需数据库支持 XA 协议、性能更高、使用成本更低,是电商微服务的首选方案。
undo_log 是 AT 模式的核心表,用于存储事务回滚日志,必须在所有参与分布式事务的独立数据库中创建(订单库、库存库都需要执行)。

执行官方标准 SQL 脚本,包含表结构与优化索引:
CREATE TABLE IF NOT EXISTS `undo_log`
(
`branch_id` BIGINT NOT NULL COMMENT '分支事务 ID',
`xid` VARCHAR(128) NOT NULL COMMENT '全局事务 ID',
`context` VARCHAR(128) NOT NULL COMMENT 'undo_log 上下文信息',
`rollback_info` LONGBLOB NOT NULL COMMENT '回滚数据详情',
`log_status` INT(11) NOT NULL COMMENT '0: 正常状态, 1: 防御状态',
`log_created` DATETIME(6) NOT NULL COMMENT '日志创建时间',
`log_modified` DATETIME(6) NOT NULL COMMENT '日志修改时间',
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = 'AT 模式事务回滚表';
-- 添加索引,提升日志查询与清理性能
ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);仅需将原有 XA 模式配置修改为 AT 模式,订单服务、库存服务的配置文件都需要同步修改,无其他代码改动。
seata:
application-id: service-order
registry:
type: file
tx-service-group: seata_tx_group
service:
vgroup-mapping:
seata_tx_group: default
grouplist:
default: 192.168.203.200:8091
# 核心修改:将 XA 替换为 AT
data-source-proxy-mode: AT将订单服务 application.yml 中 data-source-proxy-mode 同样修改为 AT,保证两个服务事务模式统一。
基于 AT 模式验证分布式事务的提交与回滚能力,通过调试模式观察数据变化。
开启 OrderServiceImpl 中模拟事务失败的代码
在业务方法中添加断点,可视化观察事务执行流程

启动 Nacos、Seata Server、库存服务、订单服务
以调试模式调用订单创建接口 http://localhost:18082/order/create
单步执行程序,同步观察两个数据库:
业务表:订单表 t_order、库存表 t_stock 的数据变化
日志表:undo_log 表的日志生成、执行、删除过程
正常流程:业务无异常 → 订单和库存数据更新 → undo_log 异步删除
异常流程:手动抛出异常 → 全局事务回滚 → 订单和库存数据恢复 → undo_log 执行回滚逻辑