2025-02-13 Seata AT 模式详解

1.SATA AT

Seata AT模式详解

一、AT模式核心原理

Seata的AT模式(Automatic Transaction) 是一种无侵入的分布式事务解决方案,基于改进的两阶段提交(2PC)协议实现。其核心目标是减少业务代码侵入,同时通过本地事务提交与全局锁机制优化性能。

1. 两阶段流程
  1. 第一阶段(Prepare Phase)

    • 本地事务提交:业务SQL执行前,Seata通过数据源代理拦截SQL,解析语义并记录前镜像(before image)后镜像(after image)undo_log表中。
    • 全局锁申请:在本地事务提交前,尝试获取记录的全局锁。若获取成功,本地事务提交并释放本地锁;若失败则回滚本地事务 。
  2. 第二阶段(Commit/Rollback Phase)

    • 全局提交:TC通知各分支异步清理undo_log,无锁冲突,快速完成。
    • 全局回滚:通过undo_log中的前镜像生成反向SQL,执行数据补偿 。
2. 关键组件协作
  • TC(事务协调器):独立部署,维护全局事务状态,驱动提交或回滚。
  • TM(事务管理器):定义全局事务边界(通过@GlobalTransactional注解)。
  • RM(资源管理器):管理分支事务资源,生成回滚日志并与TC通信 。

二、AT模式核心机制

1. 数据镜像与回滚
  • 镜像生成:RM拦截业务SQL,记录数据修改前后的快照(before_imageafter_image),存储到undo_log表中,用于异常回滚 。
  • 全局锁隔离:通过全局锁实现写隔离,避免多个全局事务同时修改同一数据。例如,事务A持有某记录的全局锁时,事务B需等待锁释放后才能提交 。
2. 事务隔离性
  • 写隔离:基于全局锁机制,确保同一记录仅一个全局事务可修改。
  • 读隔离:默认读未提交(Read Uncommitted),通过SELECT FOR UPDATE可升级为读已提交(Read Committed)。

三、AT模式优缺点分析

优势
  • 零侵入性:无需业务代码改造,仅需添加@GlobalTransactional注解 。
  • 高性能:第一阶段释放本地锁和连接资源,减少资源占用时间,支持高并发 。
  • 简化开发:自动生成回滚日志,开发者无需手动处理补偿逻辑 。
局限性
  • 数据库限制:仅支持ACID关系型数据库(如MySQL、Oracle)。
  • SQL兼容性:部分复杂SQL(如存储过程)无法解析,需结合TCC模式实现 。

四、与TCC模式对比

对比项 AT模式 TCC模式
侵入性 无侵入,自动生成回滚日志 需业务编码实现Try/Confirm/Cancel接口
性能 高(本地事务快速提交) 较高(需多次RPC调用)
适用场景 常规数据库操作 跨服务、跨语言或非数据库操作
锁机制 全局锁 无锁,通过资源预留实现

五、Spring Cloud集成示例

  1. 依赖配置

    <!-- Seata客户端依赖 -->
    <dependency>
       <groupId>io.seata</groupId> 
       <artifactId>seata-spring-boot-starter</artifactId>
    </dependency>
    
2. **数据源代理**:
   ```java 
  @Configuration 
  public class DataSourceConfig {
      @Bean 
      public DataSource dataSource(DataSource druidDataSource) {
          return new DataSourceProxy(druidDataSource);
      }
  }
  
  1. 全局事务注解

    @Service 
    public class OrderService {
       @GlobalTransactional 
       public void createOrder() {
           // 调用库存服务、账户服务等 
       }
    }
    
4. **`undo_log`表结构**:
   ```sql 
  CREATE TABLE `undo_log` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `branch_id` BIGINT NOT NULL,
    `xid` VARCHAR(100) NOT NULL,
    `rollback_info` LONGBLOB NOT NULL,
    PRIMARY KEY (`id`)
  );
  

六、总结

Seata的AT模式通过自动生成回滚日志全局锁机制,在保证数据一致性的同时极大简化了开发。其适用于大多数基于关系型数据库的微服务场景,但对非SQL操作或复杂业务逻辑需结合TCC模式使用。实际应用中,需注意SQL兼容性及全局锁可能引发的性能瓶颈 。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容