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

Seata服务端回滚事务核心源码解析

文章目录

  • 前言
  • 一、doGlobalRollback
    • 3.1、changeGlobalStatus
    • 3.2、doGlobalRollback


前言

  本篇介绍Seata服务端接收到客户端TM回滚请求,进行处理并且驱动所有的RM进行回滚的源码。


一、doGlobalRollback

  doGlobalRollback是全局回滚的方法:
在这里插入图片描述
  首先依旧是进行校验,添加监听器。然后会关闭会话,阻止新分支注册,保证了在回滚执行期间,不会再有分支悄悄进来。

  • 判断事务是否还在「初始状态」,如果是,就可以把状态改为 Rollbacking。
  • 否则说明这个事务已经处于回滚中或提交中,可能是别的线程已经发起操作;就不再做重复回滚处理。
  • doGlobalRollback中完成全局事务回滚的逻辑。
    在这里插入图片描述

3.1、changeGlobalStatus

  该方法主要是用于修改表中的状态:

  • lock_table表中对应XID的状态改为回滚。
  • global_table表中对应XID的状态改为回滚。

在这里插入图片描述

3.2、doGlobalRollback

  doGlobalRollback的逻辑和提交事务的逻辑类似,也是有几个关键部分:

  1. 得到当前XID下的所有分支事务。
  2. 遍历这些分支事务。
  3. 拿到分支事务的状态,如果状态是一阶段提交失败,就直接移除该分支,然后继续下次循环。
  4. 驱动RM回滚。
  5. 根据RM返回的错误码判断。
  6. 执行最后的清理工作。

在这里插入图片描述
  根据RM返回的错误码:

  • PhaseTwo_Rollbacked代表回滚成功,会执行removeBranch的逻辑,删除该分支在lock_tablebranch_table以及branchSessions中的记录。
  • PhaseTwo_RollbackFailed_Unretryable代表回滚失败,并且无法重试了,会执行endRollbackFailed的逻辑。

  endRollbacked方法中,根据不同的状态,对global_table的状态进行修改。
在这里插入图片描述
  最终都会执行globalSession.end();方法,清除全局事务在lock_table表中的记录,然后清理掉global_table的记录。
  那既然 globalSession.end() 最终会物理删除 global_table 的记录,那为什么前面还要调用 globalSession.changeGlobalStatus(…) 去更新状态?

changeGlobalStatus() 虽然最终会更新数据库中的 status 字段,但是在过程中它触发了事务生命周期钩子机制,供系统其他部分观察状态变化。
changeGlobalStatus(): 我告诉所有人,这个事务已经结束了(并以某种状态结束)
end(): 把这笔事务从系统生命周期中移除(内存 + 数据库)

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

相关文章:

  • springboot中异步接口实现所有方式_20250501
  • 内存 “舞台” 上,进程如何 “翩翩起舞”?(转)
  • idea安装
  • 【Unity】 组件库分类详解
  • RAGFlow报错:ESConnection.sql got exception
  • 【基础算法】插值查找算法 - JAVA
  • (即插即用模块-Attention部分) 六十一、(2024 ACCV) LIA 基于局部重要性的注意力
  • 【数据分享】2020年中国高精度森林覆盖数据集(免费获取)
  • VBA数据库解决方案第二十讲:Select From Where条件表达式
  • 「面白い」日本 课文详解
  • 【MySQL数据库】视图
  • Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自动进入PIP Mode
  • ARM ASM
  • 【云原生】基于Centos7 搭建Redis 6.2 操作实战详解
  • 【五一培训】Day1
  • Redis 挂掉后高并发系统的应对策略:使用 Sentinel 实现限流降级与 SkyWalking 监控优化
  • PostgreSQL 数据库下载和安装
  • Stm32 烧录 Micropython
  • 基于机器学习的舆情分析算法研究
  • 连接linux虚拟机并运行C++【从0开始】
  • 机器学习实战,天猫双十一销量与中国人寿保费预测,使用多项式回归,梯度下降,EDA数据探索,弹性网络等技术
  • vue中$set原理
  • Meta公司于2025年4月29日正式推出了全新Meta AI应用程序的首个版本
  • 正则表达式:精准匹配,高效处理文本
  • 《软件设计师》复习笔记(11.1)——生命周期、CMM、开发模型
  • 结构模式识别理论与方法
  • JWT Access Token 被窃取的风险与解决方案
  • spring-boot-maven-plugin 将spring打包成单个jar的工作原理
  • 企业经营系统分类及功能详解
  • 华为eNSP:IS-IS认证