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.mzph.cn/diannao/81232.shtml

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

相关文章

新闻客户端案例的实现,使用axios获取数据并渲染页面,路由传参(查询参数,动态路由),使用keep-alive实现组件缓存

文章目录 0.页面要求1.功能要求2.开始路由配置2.1.嵌套二级路由如何配置?2.2.路由重定向,NotFound页面,去除"#"号 3.实现底部导航栏的高亮效果4.渲染首页:使用axios请求数据5.路由传参5.1.回顾:查询参数传参或者动态路由传参5.2.具体代码 6.渲染详情页7.解决请求过程…

文件操作--文件包含漏洞

本文主要内容 脚本 ASP、PHP、JSP、ASPX、Python、Javaweb --# 各种包含函数 检测 白盒 代码审计 黑盒 漏扫工具、公开漏洞、手工看参数值及功能点 类型 本地包含 有限制、无限制 远程包含 无限制、有限制…

ActiveMQ 性能优化与网络配置实战(二)

五、性能优化实战 5.1 基础配置调整 5.1.1 增加并发消费者 在 ActiveMQ 中,增加并发消费者是提高消息处理效率的重要手段之一。通过配置多个消费者并行处理消息,可以充分利用系统资源,加快消息的消费速度,从而提高系统的整体吞…

C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 17)

🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 二…

贪心算法精解(Java实现):从理论到实战

一、贪心算法概述 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优决策的算法策略。它通过局部最优选择来达到全局最优解,具有高效、简洁的特点。 核心特点: 局部最优选择:每一步都做出当前看…

深度学习框架:PyTorch使用教程 !!

文章目录 一、PyTorch框架简介 1.1 什么是PyTorch 1.2 PyTorch的优势 二、从入门到精通的PyTorch使用教程 2.1 入门阶段 2.1.1 环境安装与配置 2.1.2 Tensor基础操作 2.1.3 自动求导(Autograd) 2.1.4 构建神经网络(nn模块) 2.1.5 …

系统架构设计师:设计模式——创建型设计模式

一、创建型设计模式 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。 随着系统演化得越来越依赖于对象复合而不是类…

Dinero.js - 免费开源的 JavaScript 货币处理工具库,完美解决 JS 浮点数精度丢失问题

今天介绍一个在前后端处理货币的工具库,logo 很可爱,是一只蓝色的招财小猫。 本文封面图底图来自免费 AI 图库 StockCake。 Dinero.js 是一个用于货币计算的 JavaScript 工具库,解决开发者在金融、电商、会计等场景中处理货币时的精度丢失、…

HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)

HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析: 嵌入式操作系统特点是内核精简、专用性强、高实时性,而"功能强大"通常指的是通用操作系统&#x…

【工具】Windows批量文件复制教程:用BAT脚本自动化文件管理

一、引言 在日常开发与部署过程中,文件的自动化复制是一个非常常见的需求。无论是在构建过程、自动部署,还是备份任务中,开发者经常需要将某个目录中的 DLL、配置文件、资源文件批量复制到目标位置。相比使用图形界面的复制粘贴操作&#xf…

xray-poc编写示例

禁止未授权扫描和测试行为!!! 1. SQL 时间盲注检测 (Time-Based Blind SQLi) name: generic/time-based-sqli rules:- method: GETpath: "/product?id1 AND (SELECT 1 FROM (SELECT SLEEP(5))a)--"expression: |response.status…

【Day 14】HarmonyOS分布式数据库实战

一、分布式数据库基础 1. 核心概念速记表 术语解释示例场景分布式数据库数据自动同步到同账号设备手机添加商品→平板立即显示KV数据模型键值对存储(类似JSON){"cart_item1": {"name":"牛奶","price":10}}数据…

【数据结构】- 栈

前言: 经过了几个月的漫长岁月,回头时年迈的小编发现,数据结构的内容还没有写博客,于是小编赶紧停下手头的活动,补上博客以洗清身上的罪孽 目录 前言: 栈的应用 括号匹配 逆波兰表达式 数制转换 栈的实…

TDA4VM SDK J721E (RTOS/Linux) bootloaders梳理笔记

文章目录 1. 前言2. RTOS BootLoader2.1 引导模式2.2 启动序列2.2.1 流程框图2.2.2 Memory map2.3 镜像格式详解3. Linux BootLoader镜像格式详解启动流程参考1. 前言 TDA4VM的BootLoader包含两部分:RTOS的和Linux的。 2. RTOS BootLoader 这是在SoC上的所有内核运行FreeRTO…

Spring Boot + MyBatis-Plus 的现代开发模式

之前的Maven项目和本次需要的环境配置并不一样 之前使用的是: 传统的 MyBatis 框架(非 Spring Boot 环境) 手动管理 SqlSession 使用了 .xml 的 Mapper 映射文件 没有 Spring 容器管理(没有 Service / RestController 等&…

【Quest开发】极简版!透视环境下抠出身体并能遮挡身体上的服装

前两天发了一个很复杂的版本,又鼓捣了一下发现完全没有必要。我之前的理解有点偏(不是错误的但用法错了),但是有一些小伙伴收藏了,害怕里面的某些东西对谁有用,所以写了一篇新的,前两步配置环境…

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库,提供了丰富的组件和主题定制功能。官方网站:Element UI 2. 主要特点 丰富的组件:包括表单、表格、布局、导航、弹窗等多种组件。主题定制:支持主…

MATLAB画一把伞

% 伞的参数num_ribs 5; % 伞骨数量修改为5R 1; % 伞的半径height 0.5; % 伞的高度handle_length 2; % 伞柄长度semicircle_radius 0.26; % 伞柄末端半圆的半径% 生成伞叶网格theta linspace(0, 2*pi, 100);phi linspace(0, pi/2, 50);[Theta, Phi] meshgrid(theta, phi…

如何在 Go 中实现各种类型的链表?

链表是动态内存分配中最常见的数据结构之一。它由一组有限的元素组成,每个元素(节点)至少占用两块内存:一块用于存放数据,另一块用于存放指向下一个节点的指针。本文教程将说明在 Go 语言中如何借助指针和结构体类型来…

新一代机载相控阵雷达的发展

相控阵雷达以其优越的性能在军事领域中有着广阔的应用前景,但由于复杂的技术、昂贵的造价使其应用范围还存在一定的局限性。然而,国内外对相控阵技术的研究非常重视,并取得了丰硕的成果。 军用相控阵雷达主要分为陆基、海基和空基几种类型。 …