当前位置: 首页 > ai >正文

Seata 分布式事务 AT 模式

⚙️ 一、AT 模式的核心机制

1. 两阶段提交优化
  • 一阶段(业务执行)

    • 解析业务 SQL,生成前镜像(before image)和后镜像(after image)。

    • 执行业务 SQL 并提交本地事务,释放本地锁。

    • 插入回滚日志(undo_log表)并向 TC(事务协调者)注册分支事务,申请全局锁135。

  • 二阶段(异步提交/补偿回滚)

    • 提交:异步删除 undo_log 记录,释放全局锁。

    • 回滚:根据 undo_log 中的前镜像生成反向 SQL 回滚数据,校验数据一致性(防止脏写)348。

2. 全局锁解决脏写问题
  • 一阶段提交前,RM(资源管理器)需获取目标数据的全局锁。

  • 若其他事务尝试修改同一数据,需等待全局锁释放(超时则回滚本地事务),避免脏写14。


📊 二、AT 模式 vs. XA 模式

特性AT 模式XA 模式
锁占用时间一阶段提交后释放本地锁整个事务过程持有锁
性能高(二阶段异步提交)低(同步阻塞)
数据一致性默认读未提交(通过 SELECT FOR UPDATE 支持读已提交)强一致性
侵入性无侵入(代理数据源)需数据库支持 XA 协议

🔧 三、AT 模式的实现步骤

1. 环境准备
  • 数据库:创建 undo_log 表(必需的回滚日志存储)4:

    sql

    复制

    下载

    CREATE TABLE undo_log (id BIGINT AUTO_INCREMENT PRIMARY KEY,branch_id BIGINT NOT NULL,xid VARCHAR(100) NOT NULL,rollback_info LONGBLOB NOT NULL,log_status INT NOT NULL,log_created DATETIME NOT NULL,log_modified DATETIME NOT NULL,INDEX idx_xid (xid)
    );
2. Seata 服务端(TC)配置
  • 启动命令:sh seata-server.sh -p 8091 -h 0.0.0.0

  • 存储模式建议使用 db(高可用),配置 MySQL 存储全局事务信息6。

3. 客户端集成(Spring Cloud)
  • 依赖

    xml

    复制

    下载

    运行

    <dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.6.1</version>
    </dependency>
  • 数据源代理

    java

    复制

    下载

    @Bean
    public DataSource dataSource(DruidDataSource druidDataSource) {return new DataSourceProxy(druidDataSource);  // 关键:代理原生数据源
    }
  • 全局事务注解

    java

    复制

    下载

    @GlobalTransactional
    public void createOrder() {orderService.insert();          // 本地事务storageFeignClient.deduct();    // 远程调用(RM 自动注册分支事务)
    }

⚠️ 四、注意事项与最佳实践

  1. SQL 规范

    • 操作必须包含主键(用于生成前后镜像)。

    • 不支持无条件的 UPDATE/DELETE 语句(避免全表更新)38。

  2. 隔离性保障

    • 默认全局读未提交,需读已提交时使用 SELECT FOR UPDATE(自动申请全局锁)4。

  3. 性能优化

    • 异步删除 undo_log:配置 client.undo.logDeletePeriod=86400000(每日清理)。

    • 索引优化:为 undo_log 表的 xid 和 status 字段添加索引6。

  4. 高可用部署

    • TC 集群:通过注册中心(如 Nacos)实现多节点部署。

    • 数据库存储:使用 MySQL/Oracle 替代 file 模式6。


💎 总结

Seata AT 模式以 无侵入性 和 高性能异步提交 为核心优势,适用于大多数微服务场景。通过全局锁和回滚日志机制,在保证数据一致性的同时避免了传统 XA 协议的资源阻塞问题。对于新项目,AT 模式是快速落地分布式事务的首选方案;复杂场景可结合 TCC 或 Saga 模式补充64。

示例代码及 TC 配置详见 Seata 官方文档。

http://www.xdnf.cn/news/12209.html

相关文章:

  • IP如何挑?2025年海外专线IP如何购买?
  • python打卡day45@浙大疏锦行
  • Vehicle HAL(5)--vhal 实现设置属性的流程
  • Silicon EFR32xG22 错误问题和解决办法汇总
  • Linux目录结构
  • ROS2里面与话题 /move_base_simple/goal 和 /move_base/status 相对应的话题名字及其含义
  • 整理几个概念:DCU DTK HIP hipcc ROCm LLVM Triton MIGraphX 怎么增加GStreamer插件
  • 可穿戴设备:健康监测的未来之眼
  • 2025年阿里最新软件测试面试题:Web 测试+接口测试+App 测试
  • DAY 22 复习日
  • 获取第三方图片接口文件流并保存服务器
  • 8天Python从入门到精通【itheima】-71~72(数据容器“序列”+案例练习)
  • 串:BF算法(朴素的魔术匹配算法)
  • 【深度学习-Day 23】框架实战:模型训练与评估核心环节详解 (MNIST实战)
  • MQTTX连接移动云的例子
  • JMeter 实现 MQTT 协议压力测试 !
  • 云服务器Xshell登录拒绝访问排查
  • 使用 Deleaker 精准定位内存与 GDI 资源泄漏
  • Matplotlib 库来可视化频谱泄漏和加窗的效果
  • 【如何做好应用架构?】
  • RTOS:创建队列(含源码分析)
  • 搭建DNS域名解析服务器(正向解析资源文件)
  • 数据结构:递归:泰勒展开式(Taylor Series Expansion)
  • 如何搭建自动化测试框架?
  • simulink有无现成模块可以实现将三个分开的输入合并为一个[1*3]的行向量输出?
  • nginx 服务启动失败问题记录
  • 华新精科IPO“上会” 四大疑惑待解
  • LeetCode | 滑动窗口的原理及真题解析
  • JavaScript 数组与流程控制:从基础操作到实战应用
  • 八皇后问题深度解析