SeataAT模式

Seata AT模式(自动事务模式)详解

AT(Automatic Transaction)模式是 Seata 默认的分布式事务解决方案 ,它通过对业务代码 零侵入 的方式,自动管理分布式事务,开发者只需关注业务逻辑,像使用本地事务一样简单。


1. AT模式的核心原理

AT模式基于 两阶段提交(2PC) 改进而来,但不同于传统XA协议,它不需要数据库原生支持XA,而是通过 拦截SQL + 生成回滚日志 实现事务管理。

阶段1:执行本地事务并生成undo_log

  1. 解析SQL:Seata 通过JDBC代理拦截业务SQL,解析SQL语义(如INSERT/UPDATE/DELETE)。
  2. 生成快照 :在数据更新前,保存修改前的数据镜像(before image)到 undo_log 表。
  3. 执行业务SQL :提交本地事务,同时记录修改后的数据镜像(after image)。
  4. 注册分支事务:向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),用于回滚。

  • 存储在当前业务数据库中,格式如下:

    sql 复制代码
    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模式的优缺点

✅ 优点

  1. 零代码侵入 :无需手动编写TCC的 try/confirm/cancel 方法。
  2. 高性能:本地事务直接提交,无需全局锁等待(仅在回滚时检查锁)。
  3. 支持大多数SQL:兼容主流关系型数据库(MySQL、PostgreSQL、Oracle等)。

❌ 缺点

  1. 依赖数据库 :需要创建 undo_log 表,且仅支持支持ACID的数据库。
  2. 不适用于跨语言:AT模式依赖Seata的JDBC代理,仅适用于Java应用。
  3. 不适用于长事务:长时间占用全局锁可能影响并发性能。

4. AT模式 vs TCC模式

特性 AT模式 TCC模式
侵入性 无侵入(自动代理SQL) 高侵入(需手动实现try/confirm/cancel)
性能 较高(本地事务直接提交) 较高(无全局锁)
适用场景 短事务、高并发简单场景 复杂业务逻辑(如资金冻结/扣减)
隔离性 通过全局锁保证 业务自行控制

5. 适用场景

  • 适合 :
    • 简单的CRUD操作(如订单创建、库存扣减)。
    • Java技术栈(Spring Cloud/Dubbo)。
  • 不适合 :
    • 跨语言微服务(如Go/Python)。
    • 需要高隔离性的金融级交易(可用TCC替代)。

6. 代码示例(Spring Boot + Seata AT)

java 复制代码
@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private 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模式。

相关推荐
瓶瓶持续学习中11 分钟前
空间智能与物理AI:国内厂商如何与英伟达协同发展
大数据·人工智能·信息可视化·架构
天远Date Lab25 分钟前
零信任架构实战:基于天远企业股权变更构建自动化招投标供应商股东穿透审查网关
java·人工智能·架构·自动化
GOWIN革文品牌咨询28 分钟前
B2B圆桌内容化:问题链、记录与授权工作流
大数据·架构
Erishen28 分钟前
进程内 ABAC 决策引擎:为了砍掉每次授权的一跳网络,我把判定塞进了站点自己的进程
架构·开源·agent
vivo互联网技术44 分钟前
KDC 全景:从现实到反馈的完整工程模型 |KDC 系列 05
人工智能·架构
Leo.yuan1 小时前
大型制造集团数据融合:300TB 级多系统集成的架构路线怎么选?
架构·制造
可乐ea1 小时前
子智能体该不该并回主循环:一份架构取舍清单
架构·ai智能体·上下文工程·agent架构·子智能体·单agent循环
Dawson Zhu1 小时前
【AI编译器入门④】编译中端:图优化Pass全解析——DCE、常量折叠、算子融合与布局变换
人工智能·语言模型·架构·aigc·agi
Decay__1 小时前
附-01 · MySQL 压测与容量规划 —— sysbench 基准测试、容量评估与参数基线
运维·数据库·sql·mysql·架构
这个DBA有点耶2 小时前
主从切换报成功,业务却写不进去——数据层脑裂与应用层连接残留的两类假成功
数据库·架构·dba