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

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(): 把这笔事务从系统生命周期中移除(内存 + 数据库)

相关文章:

  • 【内存管理】对象树(内存管理)
  • 轻文轻小说网站备份,轻文轻小说网站备份的方法
  • 基于Koa实现的服务端渲染 ✅
  • Linux——虚拟地址空间
  • Cribl 数据脱敏 更多方法 MASK (三)
  • C++使用accumulate函数对数组进行快速求和
  • DBeaver虚拟主键会影响实际的数据库吗
  • 《AI大模型应知应会100篇》第41篇:多轮对话设计:构建高效的交互式应用
  • VM虚拟机安装CentOS7.9
  • spring-cloud-alibaba最新版本聚合项目创建
  • 理解计算机系统_网络编程(6)_web服务器
  • 完美中国制度流程体系建设(70页PPT)(文末有下载方式)
  • 拉宾公钥密码算法实现
  • Dubbo(88)如何设计一个跨地域的Dubbo服务?
  • Leetcode刷题记录24——最大子数组和
  • 在 Modal 平台上高效部署 DeepSeek 模型:从环境准备到实战案例
  • 小白dockerfile
  • 数字智慧方案5972丨智慧农业大数据平台解决方案(65页PPT)(文末有下载方式)
  • 协议(消息)配置
  • ctfshow web入门 web44
  • 2025五一档首日电影票房破亿
  • 湖北鄂州通报4所小学学生呕吐腹泻:供餐企业负责人被采取强制措施
  • 制定出台民营经济促进法有何重大意义?全国人大常委会法工委回应
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 铁路上海站今日预计发送旅客65.8万人次,同比增长超16%
  • 牛市早报|今年第二批810亿元超长期特别国债资金下达,支持消费品以旧换新