SeataAT模式
Seata AT模式(自动事务模式)详解
AT(Automatic Transaction)模式是 Seata 默认的分布式事务解决方案,它通过对业务代码 零侵入 的方式,自动管理分布式事务,开发者只需关注业务逻辑,像使用本地事务一样简单。
1. AT模式的核心原理
AT模式基于 两阶段提交(2PC) 改进而来,但不同于传统XA协议,它不需要数据库原生支持XA,而是通过 拦截SQL + 生成回滚日志 实现事务管理。
阶段1:执行本地事务并生成undo_log
- 解析SQL:Seata 通过JDBC代理拦截业务SQL,解析SQL语义(如INSERT/UPDATE/DELETE)。
- 生成快照:在数据更新前,保存修改前的数据镜像(
before image
)到undo_log
表。 - 执行业务SQL:提交本地事务,同时记录修改后的数据镜像(
after image
)。 - 注册分支事务:向Seata TC(事务协调器)注册分支事务状态。
阶段2:全局提交或回滚
- 如果所有分支成功:TC通知各分支删除
undo_log
,事务完成。 - 如果有分支失败:TC通知各分支根据
undo_log
回滚数据。
2. AT模式的关键机制
(1)全局锁(Global Lock)
- 防止其他事务在 阶段1提交后、阶段2完成前 修改相同数据(避免脏写)。
- 通过
SELECT FOR UPDATE
实现,保证事务隔离性。
(2)undo_log 回滚日志
- 记录数据修改前后的快照(
before image
和after image
),用于回滚。 - 存储在当前业务数据库中,格式如下:
INSERT INTO undo_log (branch_id, xid, context, rollback_info, log_status, log_created, log_modified) VALUES (?, ?, ?, ?, ?, NOW(), NOW());
(3)事务协调器(TC)
- Seata Server(TC)负责协调全局事务状态,决定提交或回滚。
3. AT模式的优缺点
✅ 优点
- 零代码侵入:无需手动编写TCC的
try/confirm/cancel
方法。 - 高性能:本地事务直接提交,无需全局锁等待(仅在回滚时检查锁)。
- 支持大多数SQL:兼容主流关系型数据库(MySQL、PostgreSQL、Oracle等)。
❌ 缺点
- 依赖数据库:需要创建
undo_log
表,且仅支持支持ACID的数据库。 - 不适用于跨语言:AT模式依赖Seata的JDBC代理,仅适用于Java应用。
- 不适用于长事务:长时间占用全局锁可能影响并发性能。
4. AT模式 vs TCC模式
特性 | AT模式 | TCC模式 |
---|---|---|
侵入性 | 无侵入(自动代理SQL) | 高侵入(需手动实现try/confirm/cancel) |
性能 | 较高(本地事务直接提交) | 较高(无全局锁) |
适用场景 | 短事务、高并发简单场景 | 复杂业务逻辑(如资金冻结/扣减) |
隔离性 | 通过全局锁保证 | 业务自行控制 |
5. 适用场景
- 适合:
- 简单的CRUD操作(如订单创建、库存扣减)。
- Java技术栈(Spring Cloud/Dubbo)。
- 不适合:
- 跨语言微服务(如Go/Python)。
- 需要高隔离性的金融级交易(可用TCC替代)。
6. 代码示例(Spring Boot + Seata AT)
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate StorageService storageService;@GlobalTransactional // 开启Seata全局事务public void createOrder(String userId, String commodityCode, int count) {// 1. 扣减库存(远程调用)storageService.deduct(commodityCode, count);// 2. 创建订单(本地事务)Order order = new Order(userId, commodityCode, count);orderMapper.insert(order);// 模拟异常触发回滚if (count > 100) {throw new RuntimeException("测试回滚");}}
}
总结
AT模式是Seata最常用的分布式事务方案,适合Java技术栈的短事务场景。如果业务需要更高灵活性(如跨语言、复杂补偿逻辑),可考虑TCC或SAGA模式。