at模式通过代理数据源、自动解析sql并生成undo_log实现无侵入,开发者仅需添加@globaltransactional注解,业务sql和本地事务逻辑无需修改,框架自动完成快照记录与回滚。

Seata 实现无侵入式分布式事务,核心在于 AT 模式——它不改动业务 SQL 和原有事务逻辑,仅通过代理数据源、自动解析 SQL、生成 undo_log 日志来完成两阶段回滚,开发者只需加一个注解就能开启全局事务。
AT 模式如何做到“无侵入”
AT 模式不强制要求你写补偿方法(如 TCC 的 Confirm/Cancel),也不依赖消息队列或手动建表维护状态。它的无侵入性体现在:
- 业务代码完全保持原样:SQL 还是原来的 INSERT/UPDATE/DELETE,事务仍用 Spring 的
@Transactional管理本地事务; - 只需在入口方法上添加
@GlobalTransactional注解,Seata 就会自动拦截、解析 SQL,生成 before/after image 并写入undo_log表; - 框架层通过
DataSourceProxy替换原始数据源,在 JDBC 执行前后自动完成快照记录与清理,业务方无感知。
关键配置和初始化步骤
要让 AT 模式真正跑起来,以下几项必须到位:
- 每个参与服务的数据库中,需提前创建
undo_log表(Seata 提供标准建表语句,MySQL/Oracle/PostgreSQL 均支持); - 启动 Seata Server(TC),并配置注册中心(如 Nacos)和配置中心,确保所有服务能发现并连接到 TC;
- 业务服务引入
seata-spring-boot-starter,在application.yml中指定tx-service-group,该分组名需与 Seata Server 配置一致; - 数据源必须包装为
DataSourceProxy(Spring Boot 自动装配,但需确认未被其他 AOP 或多数据源配置覆盖)。
典型使用场景与注意事项
以电商下单为例:订单服务调用库存服务扣减库存、账户服务扣款,三者需原子性执行。此时:
- 在订单服务的创建订单方法上加
@GlobalTransactional,整个链路即纳入全局事务; - 各服务内部仍各自管理本地事务,Seata RM 会在每个分支事务提交前,把变更前后的数据快照存入
undo_log; - 若任一环节失败(如账户余额不足),TC 会通知所有 RM 回滚——不是靠业务重试,而是直接用
undo_log中的 before image 还原数据; - 避免在全局事务内做异步调用(如
@Async)、线程池提交、或跨 JVM 调用,否则分支事务无法注册到 TC。
为什么说它比传统 2PC 更实用
传统两阶段提交要求所有参与者全程阻塞等待协调者指令,而 AT 模式在一阶段就提交本地事务,只保留回滚能力:
- 一阶段:业务 SQL 执行 + 快照写入 + 分支注册 → 本地事务立即提交,释放数据库锁,提升并发吞吐;
- 二阶段:TC 根据结果发 commit 或 rollback 指令 → commit 仅清理日志;rollback 则按 undo_log 反向执行还原;
- 即使 TC 短时不可用,RM 仍可按超时策略自动回滚(默认 60 秒),降低单点风险;
- 无需业务方实现任何补偿逻辑,也没有 TCC 那种 Try 接口的额外开发负担。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











