Seata AT 模式两阶段过程原理解析【seata AT模式如何做到对业务的无侵入】

在分布式事务中,Seata 的 AT 模式(Automatic Transaction)是一种基于两阶段提交协议的事务模式。它通过自动生成数据快照(before imageafter image),实现了对分布式事务的高效管理。本文将详细解析 Seata 的 AT 模式两阶段过程,以及 Undo Log 和逆向 SQL 的关系。


1. Seata AT 模式简介

Seata 的 AT 模式是一种基于本地数据库事务的自动事务模式,具备以下核心特点:

  • 自动化:通过拦截业务 SQL,自动记录事务前后的数据快照(before imageafter image)。
  • 两阶段性:通过两阶段协议(提交或回滚),保证分布式事务的一致性和隔离性。

AT 模式主要通过事务协调器(Transaction Coordinator, TC)来管理事务的状态和分支协调,客户端通过 Resource Manager(RM)和 Transaction Manager(TM)与协调器交互。


2. AT 模式两阶段过程

2.1 第一阶段:业务 SQL 执行

第一阶段的核心任务是执行业务 SQL,并记录事务前后的数据快照,以便为后续可能的回滚提供依据。具体流程如下:

  1. 拦截业务 SQL
    Seata 拦截应用程序提交的业务 SQL,解析其语义(如表名、操作类型、条件范围等),确定受影响的数据行。

  2. 保存 before image
    在业务 SQL 执行前,从数据库中查询受影响行的状态,并记录为 before image(事务执行前的数据快照)。

    • 示例
      • SQL:UPDATE user SET age = 30 WHERE id = 1;
      • before image
        { "id": 1, "name": "Alice", "age": 25 }
        
  3. 执行业务 SQL
    实际执行业务 SQL,对数据库进行更新。例如:

    • SQL:UPDATE user SET age = 30 WHERE id = 1;
    • 执行后,数据库记录变为:
      { "id": 1, "name": "Alice", "age": 30 }
      
  4. 保存 after image
    在业务 SQL 执行后,从数据库中再次查询受影响行的状态,并记录为 after image(事务执行后的数据快照)。

    • 示例
      • after image
        { "id": 1, "name": "Alice", "age": 30 }
        
  5. 生成逻辑行锁
    Seata 会为受影响的行生成逻辑锁,以防止其他事务对同一行的数据进行修改。

以上操作均在一个本地事务中完成,确保原子性。
第一阶段操作流程图


2.2 第二阶段:事务提交或回滚

第二阶段根据事务协调器(TC)的决策,决定是提交还是回滚。

2.2.1 提交
  • 提交操作
    • 因为第一阶段的业务 SQL 已经提交至数据库,Seata 只需清除 Undo Log 和行锁,完成事务的清理工作。
  • 提交流程图
    提交流程图
2.2.2 回滚
  • 回滚操作
    • 如果事务协调器判定事务失败,Seata 会根据 before image 还原事务执行前的数据状态。
    • 脏写校验
      • 首先验证当前数据库的业务数据是否与 after image 一致。
      • 如果一致,则没有脏写,可以安全回滚。
      • 如果不一致,则存在脏写,需要人工介入处理。
  • 回滚方式
    • 提取 before image 数据。
    • 基于 before image 生成逆向 SQL。
    • 执行逆向 SQL 将数据恢复到事务前的状态。
      在这里插入图片描述

3. Undo Log 与逆向 SQL 的关系

3.1 Undo Log 的数据结构

Undo Log 是用于记录事务执行前后的数据快照的日志结构,主要包括:

  • 事务信息:全局事务 ID 和本地事务分支 ID。
  • 表名:事务涉及的表。
  • 受影响的行数据
    • before image:事务执行前的行状态。
    • after image:事务执行后的行状态。
  • 操作类型:记录操作类型(INSERTUPDATEDELETE)。
  • 时间戳:记录事务发生的时间。

3.2 Undo Log 的作用
  • 快照保存
    • before image:用于回滚事务,恢复数据。
    • after image:用于脏写校验,确保数据一致性。
  • 回滚依据
    • 在回滚时,从 Undo Log 中提取快照,生成逆向 SQL。

3.3 为什么需要逆向 SQL?

尽管 before image 已经记录了事务前的状态,但直接覆盖数据库是不现实的,原因如下:

  1. 数据库只能通过 SQL 修改数据

    • 数据库本身没有直接应用快照的接口,必须通过 SQL 操作数据。
    • 逆向 SQL 是对数据操作的精确描述。
  2. 还原需要精确性

    • 事务操作可能只修改了部分字段。例如:
      • SQL:UPDATE user SET age = 30 WHERE id = 1;
      • 逆向 SQL 只需还原 age 字段,而不是覆盖整条记录。
  3. 操作类型的不同处理

    • INSERT:回滚时需要生成 DELETE SQL 删除记录。
    • UPDATE:回滚时需要生成反向的 UPDATE SQL 恢复字段。
    • DELETE:回滚时需要生成 INSERT SQL 插入记录。

4. Seata AT 模式回滚示例

业务场景

假设数据库中有一张 user 表,初始数据为:

{ "id": 1, "name": "Alice", "age": 25 }

第一阶段:业务 SQL 执行

  • SQL:
    UPDATE user SET age = 30 WHERE id = 1;
    
  • before image
    { "id": 1, "name": "Alice", "age": 25 }
    
  • after image
    { "id": 1, "name": "Alice", "age": 30 }
    

第二阶段:回滚

  1. 提取 before image

    { "id": 1, "name": "Alice", "age": 25 }
    
  2. 生成逆向 SQL

    UPDATE user SET age = 25 WHERE id = 1;
    
  3. 执行逆向 SQL

    • 将数据恢复到事务执行前的状态:
      { "id": 1, "name": "Alice", "age": 25 }
      

5. 总结

Seata 的 AT 模式通过 Undo Log 记录数据快照(before imageafter image),结合两阶段协议实现事务的一致性和回滚功能。在回滚过程中,逆向 SQL 的生成是核心环节:

  • Undo Log 提供数据依据:提取事务前状态(before image)。
  • 逆向 SQL 精确还原数据:根据操作类型生成特定的 SQL 操作。

这种机制不仅满足了分布式事务的隔离性要求,还提高了事务管理的自动化和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/496651.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中关村科金外呼机器人智能沟通破解营销难题

当今,传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性,难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员,成为企业的难题。中关村科金外呼机器人通过智能化沟通技术,为企业提供了一站…

旅游景点票价预测02

5.数据预处理 经过4的数据分析环节,我们得出了一些和目标特征‘price’关联度比较高的特征,现在将这些特征列进行提取 df.head(5)# 筛选对应的数据列 rs_df df[[price,comment,sight_comment_score,level,city,address]] # 判断是否有缺失值 rs_df.isnu…

“事务认证平台”:个人日常事务管理系统的诚信体系建设

3.1系统体系结构 系统的体系结构非常重要,往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为个人日常事务管理系统,属于开放式的平台,所以在体系结构中采用B/s。B/s结构抛弃了固定客户端要求,…

单片机与MQTT协议

MQTT 协议简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布 / 订阅(publish/subscribe)模式的 “轻量级” 通讯协议,该协议构建于 TCP/IP 协议上&#xf…

小程序基础 —— 07 创建小程序项目

创建小程序项目 打开微信开发者工具,左侧选择小程序,点击 号即可新建项目: 在弹出的新页面,填写项目信息(后端服务选择不使用云服务,开发模式为小程序,模板选择为不使用模板)&…

【js】记录预览pdf文件

接口调用拿到pdf的文件流,用blob处理这个文件流拿到url,使用window.open跳转新的窗口进行预览 api({dataType: blob, }).then(res >{if(res.code 0){this.previewPDF(res,application/pdf;charsetutf-8,pdf文件名)} })previewPDF (res, type, fname…

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择:K值代表选择与新测试样本距离最近的前K个训练样本数,通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…

“拍卖认证平台”:网上拍卖系统的诚信体系建设

2.1 B/S结构介绍 在早期,一些使用HTML语言编写的文件,再集合一些其它资源文件就可以组成一个最简单的Web程序,了解了Web程序也需要了解Web站点,它们之间的关系就是一个或者多个Web程序可以放在Internet上的一个Web站点&#xff08…

【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火

:羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言: 在当今数字化的时代,人工智能生成内容(AIGC)正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师,…

C++:单例模式

创建自己的对象,同时确保对象的唯一性。 单例类只能有一个实例☞静态成员static☞静态成员 必须类外初始化 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 静态成员类内部可以访问 构造函数私有化☞构造函数私有外部不能创建&#x…

day26 文件io

函数接口 1 .open和close 文件描述符:系统为用open打开的文件分配的标识符 非负的整形数据 0-1023 最小未被使用原则 使用完时及时释放,避免文件描述符溢出 文件描述溢出就是文件使用完没有及时关闭文件 int open(const char *pathname, int flags); /…

mysql索引的理解

1、索引是什么? 索引:简单理解就是我们字典的目录,一个索引可以找得到多个记录。 作用加快我们数据库的查询速度。索引本身较大,往往存储在磁盘的文件里。可能存储在单独的索引文件中,也可能和数据一起存储在数据文件…

Leetcode打卡:查询数组中元素出现的位置

执行结果:通过 题目 3159 查询数组中元素出现的位置 给你一个整数数组 nums ,一个整数数组 queries 和一个整数 x 。 对于每个查询 queries[i] ,你需要找到 nums 中第 queries[i] 个 x 的位置,并返回它的下标。如果数组中 x 的出…

Overleaf中设置表格中的字体为Times New Roman

在Overleaf中设置表格中的字体为Times New Roman 需要有这个字体包 使用 \usepackage{times} 宏包 在文档的导言区添加 \usepackage{times} 宏包,这将把整个文档的字体设置为Times New Roman,包括表格中的字体。例如:\documentclass{article} \usepackage{times} \begin{…

如何理解 CNN 中的 RGB 图像和通道?

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 在灰度图一节的最后,给出了一个由彩色图片转成灰度图的示例,并且通过 color_image.mode获取了图片的格式:彩色图片获取到的格式为 RGBA&a…

可灵1.6正式上线,图生视频再创新视界

大家最近有刷到过这几个视频吗? “一觉醒来,罗马斗兽场塌了”,可达鸭睡塌了罗马斗兽场! 【视频来源于网络,侵删】 “卡比兽把一碗雪倒扣在富士山上,富士山瞬间被雪覆盖” 【图片来源于网络,侵删…

微积分复习(微分方程)

1,一阶微分方程 可分离的微分方程: 可以把x和y分列等号两边,然后求积分可以解决 齐次方程和准齐次方程 要求是 :yf(y/x),也就是没有单独的x项,我们可以通过设ty/x来统一变量方便我们运算 准齐次方程就是常数项不统一,我们可以将Xxa,Yyb来消灭常数项进而转化为齐次形式…

【火猫DOTA2】VP一号位透露队伍不会保留原阵容

1、最近VP战队的一号位选手Kiritych在直播中透露,VP战队的阵容将会有新的变动,原有的阵容将不再保留。 【目前VP战队阵容名单如下】 一号位:Kiritych 二号位:squad1x 三号位:Noticed 四号位:Antares 五号位:待定 2、Spirit的战队经理Korb3n在直播时谈到了越来越多的职业选…

两分钟解决:vscode卡在设置SSH主机,VS Code-正在本地初始化VSCode服务器

问题原因 remote-ssh还是有一些bug的,在跟新之后可能会一直加载初始化SSH主机解决方案 1.打开终端2.登录链接vscode的账号,到家目录下3.找到 .vscode-server文件,删掉这个文件4.重启 vscode 就没问题了

[银河麒麟] Geogebra

Geogebra 几何作图工具 是一款跨平台的几何作图工具软件, 目前已经覆盖了, windows,android, mac, linux 等操作系统。 Geogebra 官网 Geogebra 官网提供了 Geogebra 5.0 版本下载包, Linux Portable 双击 geogebra-portable…