Seata AT模式 #

一、AT模式概述 #

1.1 什么是AT模式 #

AT模式是Seata提供的无侵入式分布式事务解决方案,通过自动补偿实现事务回滚。

text
┌─────────────────────────────────────────────────────────────┐
│                    AT模式架构                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                    TM (事务管理器)                    │  │
│   │                  Transaction Manager                 │  │
│   └───────────────────────────┬─────────────────────────┘  │
│                               │                             │
│   ┌───────────────────────────┼─────────────────────────┐  │
│   │                           │                         │  │
│   │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐ │  │
│   │  │ RM (资源管理)│  │ RM (资源管理)│  │ RM (资源管理)│ │  │
│   │  │  数据库A    │  │  数据库B    │  │  数据库C    │ │  │
│   │  └─────────────┘  └─────────────┘  └─────────────┘ │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 AT模式原理 #

text
一阶段:
1. 解析SQL,记录前镜像
2. 执行业务SQL
3. 记录后镜像
4. 生成Undo Log

二阶段-提交:
异步删除Undo Log

二阶段-回滚:
根据Undo Log反向生成SQL恢复数据

二、环境搭建 #

2.1 部署Seata Server #

bash
docker run -d --name seata-server -p 8091:8091 seataio/seata-server:latest

2.2 添加依赖 #

xml
<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.7.0</version>
</dependency>

2.3 配置文件 #

yaml
seata:
  enabled: true
  application-id: user-service
  tx-service-group: my_tx_group
  service:
    vgroup-mapping:
      my_tx_group: default
  registry:
    type: nacos
    nacos:
      server-addr: localhost:8848

三、使用方式 #

3.1 数据库表 #

sql
CREATE TABLE `undo_log` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `branch_id` bigint NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
);

3.2 开启事务 #

java
@Service
public class OrderService {

    @GlobalTransactional
    public void createOrder(Order order) {
        orderMapper.insert(order);
        inventoryService.deduct(order.getProductId(), order.getQuantity());
        accountService.debit(order.getUserId(), order.getAmount());
    }
}

四、总结 #

要点 说明
无侵入 无需修改业务代码
自动补偿 自动生成回滚SQL
Undo Log 记录数据变更

接下来让我们学习 Seata TCC模式

最后更新:2026-03-28