源本科技 | 码上会

分布式事务 Seata AT 模式

2026/05/24
1
0

引言

Seata AT 模式是分布式事务的改进型两阶段提交方案,通过自动代理数据源、解析业务 SQL 并生成 undo_log 回滚日志,实现零业务侵入的分布式事务管理,是微服务场景中最常用的分布式事务方案。

图示中服务 A、服务 B 代表微服务节点,事务协调者负责全局事务调度,资源管理器负责分支事务的提交与回滚,undo_log 是保障事务原子性的核心载体。

标准事务执行流程

分支事务处理(业务服务端)

  1. 开启全局事务:分布式事务发起方(如服务 A)通过 @GlobalTransactional 注解开启全局事务,Seata 生成唯一全局事务 ID(XID)

  2. 调用分支事务:服务 A 远程调用服务 B 接口,XID 自动透传,服务 B 成为分支事务参与者

  3. 注册分支事务:服务 A、服务 B 向事务协调者(TC) 注册分支事务,纳入全局事务管理

  4. 执行业务 SQL:代理数据源拦截业务 SQL,执行本地事务并自动提交,同时生成 undo_log 回滚日志存入数据库

全局事务管理(事务协调者 TC)

  1. 上报事务状态:所有分支服务向 TC 上报本地事务执行结果

  2. 全局决策:TC 根据全部分支状态,决定全局事务提交回滚

    • 全局提交:异步通知各服务删除 undo_log

    • 全局回滚:通知各服务通过 undo_log 执行数据回滚

分支事务最终执行(资源管理器 RM)

接收 TC 指令,完成提交(删除日志)或回滚(执行日志)操作,TC 会定时校验分支事务状态保证一致性

核心特性与关键逻辑

Seata AT 模式的核心设计:代理数据源解析 SQL + 自动生成 undo_log,全程无业务代码侵入,两阶段流程清晰:

  • 第一阶段:开启全局事务 → 注册分支 → 执行业务 SQL → 本地提交 → 生成 undo_log

  • 第二阶段:全局成功 → 异步删除 undo_log;全局失败 → 执行 undo_log 回滚数据

相比 XA 模式,AT 模式无需数据库支持 XA 协议、性能更高、使用成本更低,是电商微服务的首选方案。

undo_log 表创建

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`);

AT 模式配置修改

仅需将原有 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.ymldata-source-proxy-mode 同样修改为 AT,保证两个服务事务模式统一。

事务功能测试

基于 AT 模式验证分布式事务的提交与回滚能力,通过调试模式观察数据变化。

测试准备

  1. 开启 OrderServiceImpl 中模拟事务失败的代码

  2. 在业务方法中添加断点,可视化观察事务执行流程

调试测试步骤

  1. 启动 Nacos、Seata Server、库存服务、订单服务

  2. 调试模式调用订单创建接口 http://localhost:18082/order/create

  3. 单步执行程序,同步观察两个数据库:

    • 业务表:订单表 t_order、库存表 t_stock 的数据变化

    • 日志表:undo_log 表的日志生成、执行、删除过程

预期结果

  • 正常流程:业务无异常 → 订单和库存数据更新 → undo_log 异步删除

  • 异常流程:手动抛出异常 → 全局事务回滚 → 订单和库存数据恢复 → undo_log 执行回滚逻辑