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兼容性及全局锁可能引发的性能瓶颈 。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容