Mysql 存储引擎设计:xa协议相关接口功能及实现
需要对接的接口以及每个接口的实现
recovery 阶段
此阶段由 xa.cc 文件中的 xarecover_handlerton() 函数完成,它通过三个接口实现与存储引擎的沟通:recover(),commit_by_xid() ,rollback_by_xid()。其流程如下:
- 此函数首先已经收集到了最后一个 binlog 文件中成功提交了的事物 xid,将其放入一个 SET 中(具体是不是从最后一个 binlog 文件收集的,怎么收集的,下层存储引擎不需要知道)。
- 调用
recover()收集存储引擎中处于 prepared 阶段的事务,对于其中的每一个事物的 xid 判断其是否存在于上述 SET 。 - 如果 xid 存在于 SET 中,则调用
commit_by_xid()。否则则调用rollback_by_xid()。
/** This function is used to recover X/Open XA distributed transactions.@return number of prepared transactions stored in xid_list */
static int innobase_xa_recover(handlerton *hton, /*!< in: InnoDB handlerton */XA_recover_txn *txn_list, /*!< in/out: prepared transactions */uint len, /*!< in: number of slots in xid_list */MEM_ROOT *mem_root); /*!< in: memory for table names */// init
innobase_hton->recover = innobase_xa_recover;
返回值表示收集到的事务的数量
*txn_list 用于返回事务链。对于每一个处于prepare 状态的事务,InnoDB 做如下工作:
- 将其事务 xid 写入 txn_list
- 将事务对应的 table 信息 push 入 txn_list
// xid
txn_list->id = *trx->xid;
txn_list->mod_tables = new (mem_root) List<st_handler_tablename>();// tables
for (auto dd_table : trx->mod_tables) {st_handler_tablename *table = new (mem_root) st_handler_tablename();if (!table || get_table_name_info(table, dd_table, mem_root) ||txn_list->mod_tables->push_back(table, mem_root))}
len表示 txn_list 最长的长度,InnoDB 中如果 prepared 阶段的事务数量达到了 len 个,直接返回。
if (count == len)break;
/** This function is used to commit one X/Open XA distributed transaction which is in the prepared state@return 0 or error number */
static xa_status_code innobase_commit_by_xid(handlerton *hton, /*!< in: InnoDB handlerton */XID *xid); /*!< in: X/Open XA transaction identification */innobase_hton->commit_by_xid = innobase_commit_by_xid;
这个接口由于底层实现原因,可以不用参考 InnoDB 具体的操作,只需要在引擎中完成以下操作即可:
- 对该 xid 对应的事务完成恢复。
- 补充该事务的 commit_record。
/** This function is used to rollback one X/Open XA distributed transactionwhich is in the prepared state@return 0 or error number */
static xa_status_code innobase_rollback_by_xid(handlerton *hton, /*!< in: InnoDB handlerton */XID *xid); /*!< in: X/Open XA transaction identification */innobase_hton->rollback_by_xid = innobase_rollback_by_xid;
直接抛弃 xid 对应的事务,不做恢复。
甚至可以不用实现该接口,在恢复完成后抛弃没有恢复的事务就行。
XID 的设计有点坑:
用于恢复的 xid 本身只是一个 uint64 类型,但 mysql 设计的 xid_t 类型占用了 152 byte 。真正的 xid 被存进了 data 字符数组中。
按道理日志只需要记录 uint64 大小的 xid 就行,但是 xit_t 并没有提供设置其 xid 的办法,只有 set_data() 设置其 data 数据。
目前在 prepare_record 中将整个 xid_t 的内容都存入了(152b),恢复时会恢复一个完整的 xid_t。
#define XIDDATASIZE 128
typedef struct xid_t {private:/**-1 means that the XID is null*/long formatID;/**value from 1 through 64*/long gtrid_length;/**value from 1 through 64*/long bqual_length;/**distributed trx identifier. not \0-terminated.*/char data[XIDDATASIZE];
...
} XID;
prepare 阶段
此阶段只有一个 stage,对应 prepare 接口
/** This function is used to prepare an X/Open XA distributed transaction.@return 0 or error number */
static int innobase_xa_prepare(handlerton *hton, /*!< in: InnoDB handlerton */THD *thd, /*!< in: handle to the MySQL thread ofthe user whose XA transaction shouldbe prepared */bool all); /*!< in: true - prepare transactionfalse - the current SQL statementended */// init
innobase_hton->prepare = innobase_xa_prepare;
此接口需要实现两个功能:
- 判断事务是否需要回滚,如果需要,则返回错误码。
- 如果事务可以正常提交,则生成该事务的日志,生成 prepare_record(其中存储 xid),并等待落盘完成。
commit
分为了三个阶段,三个阶段之间可以并发进行,但每个阶段内顺序运行:第一个进入某个阶段的事务为 leader,后续进入的事务为 follower。leader 所在的线程领导 follower 顺序完成此阶段的任务。
- 其中第一个阶段刷 redo-log,进入这个阶段的所有事务只刷盘一次。除了刷盘 redo-log,bin-log 需要在这个阶段顺序产生,这样一来保证了 redo-log 和 bin-log 日志中事务的顺序是相同的。
- 第二个阶段刷 bin-log
- 第三个阶段执行 commit,顺序调用存储引擎的 commit 接口
/** Flush InnoDB redo logs to the file system.
@param[in] hton InnoDB handlerton
@param[in] binlog_group_flush true if we got invoked by binlog
group commit during flush stage, false in other cases.
@return false */
static bool innobase_flush_logs(handlerton *hton, bool binlog_group_flush);innobase_hton->flush_logs = innobase_flush_logs;
这个接口的作用是等待 redo_log 进行刷盘,是进行组提交的接口。但是测试发现,每一个事务prepare 之后都会调用此接口,且 InnoDB 都会执行刷盘或者等待刷盘操作。
int ha_commit_low(THD *thd, bool all, bool run_after_commit = true);innobase_hton->commit = innobase_commit;
此接口需要实现两个功能:
- 这个接口不需要做回滚操作,如果事务没有执行成功,需要执行回滚,只需要返回一个错误码。mysql 随后会调用
rollback接口回滚。 - 执行存储引擎的提交操作,并在提交结束后,生成一条 commit_record 日志记录,这里不需要等待此日志记录落盘,因为此日志记录是否落盘不影响已经提交了的事务对应的 tuple 的可见性。且日志的完整性已由 prepare_record 保证。
相关文章:
Mysql 存储引擎设计:xa协议相关接口功能及实现
需要对接的接口以及每个接口的实现 recovery 阶段 此阶段由 xa.cc 文件中的 xarecover_handlerton() 函数完成,它通过三个接口实现与存储引擎的沟通:recover(),commit_by_xid() ,rollback_by_xid()。其流程如下: 此…...
字符串常量池
1.创建对象的思考下面两种创建字符串的方式一样吗?public static void main(String[] args) {//两者一样吗String s1 "hello";String s2 "hello";String s3 new String("hello");String s4 new String("hello");System…...
让技术更有温度,腾讯Light 点亮公益之光
蓝天白云,远处是广东最长跨海大桥——南澳大桥,一艘小船在海面驶过,近处一头中华白海豚露出水面。在第三届腾讯Light技术公益创造营上,海南智渔可持续发展研究中心科学总监郑锐强为我们展现这样一幅人与自然和平相处的美好画面。随…...
电子采购一体化解决方案
企事业数字化转型专家,提供各类应用解决方案。您身边的赋能小助手! 文章目录前言一、当下采购的痛点二、解决方案-供应商管理1.供应商管理三、解决方案-企业询价、供应商报价管理四、解决方案-采购订单五、送货、到货、订单管理总结前言 随着各类产业链…...
SAP COPA 获利能力分析深度解析
一、获利分析配置及相关值概述 二、配置:组织结构 2.1 定义经营范围-KEP8 2.2 维护经营关注点-KEA0 2.3 获利能力分析类型解析 2.4 控制范围分配给经营范围-KEKK 三、配置:数据结构-KEA0 3.1 特征字段 3.1.1 特征字段类别 3.1.2 维护特征字段-K…...
Java学习记录day6
书接上回 类与对象 static关键字 static的作用: 修饰一个属性:声明为static的变量实质上就是一个全局变量,其生命周期为从类被加载开始一直到程序结束;修饰方法:无须本类的对象也可以调用该方法;修饰一个类&#x…...
ubuntu 使用 adb 工具卸载鸿蒙系统预装软件
准备工作 打开 USB 调试 进入 “设置->关于手机” 连续点击版本号, 直到有提示开启了"开发人员选项" 进入 “设置->系统和更新->开发人员选项”, 打开 USB 调式, 顺便可以把"自动系统更新"关了 下载 adb 工具 官方地址: https://developer.an…...
Jmeter in Linux - 在Linux系统使用Jmeter的坑
Jmeter in Linux - 在Linux系统使用Jmeter的坑Jmeter in Linux系列目录:o.a.j.JMeter: Error in NonGUIDriver起因错误分析:解决方案:解析日志没有展示请求和响应信息起因解决方案:注意Jmeter in Linux系列目录: 【如…...
什么是特权访问管理(PAM)
特权访问管理 (PAM) 是指一组 IT 安全管理原则,可帮助企业隔离和管理特权访问、管理特权帐户和凭据、控制谁可以获得对哪些端点的管理访问权限级别,并监视用户对该访问权限执行的操作。 什么是特权访问 特权访问是一种 IT 系统访…...
LeetCode题目笔记——1.两数之和
文章目录题目描述题目难度——简单方法一:暴力代码/Python方法二:哈希表代码/Python代码/C总结题目描述 这道题可以说是力扣的入坑题了,很经典,好像还是面试的经典题。 给定一个整数数组 nums 和一个整数目标值 target,…...
CSDN版的详细MarkDown的使用教程
MarkDown的使用欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释…...
Nextcloud通过不被信任的域名访问解决方法 Nextcloud 您正在访问来自不信任域名的服务器
windows电脑在网页端输入“http://192.168.xxx.xxx:8080/login”访问远程ubuntu18.04服务器,访问其docker镜像的Nextcloud,提示“”Nextcloud通过不被信任的域名访问解决方法 Nextcloud 您正在访问来自不信任域名的服务器“”,如下图…...
Set集合的特点,HashSet去重的几个重要问题
Set集合的特点:无下标,无序(新增顺序和遍历顺序不一致,新增顺序不影响遍历顺序,而且有一个固定顺序),去重(不允许重复记录)public class TestOne {public static void main(String[] args) {// Set集合的特点ÿ…...
云计算|OpenStack|社区版OpenStack安装部署文档(十一--- 如何获取镜像---Rocky版)
前言: 前面我们使用虚拟机搭建了一个openstack集群,也就是在VM虚拟机的基础上模拟了一个简单的基于openstack社区版Rocky的私有云,但,不管任何部署安装工作,最后其实都是需要有实际的应用的,也就是常说的实…...
UmiJS学习
UmiJS4学习笔记起步官网学习:https://umijs.org/开发环境Umi.js 需要使用 Node.js来进行开发,因此请先确保电脑已经安装了 Node.js 且版本在 14 以上。安装pnpm:npm install pnpm -g创建项目Umi 官方提供了一个脚手架 ,可以轻松快…...
Leetcode:322. 零钱兑换(C++)
目录 问题描述: 实现代码与解析: 动态规划(完全背包): 原理思路: 问题描述: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金…...
C经典小游戏之扫雷
编译环境:VS022 目录 1.算法思路 2.代码模块 2.1 game.h 2.2 game.cpp 2.3 test.cpp 3.重点分析 4.金句省身 1.算法思路 主要采用二维数组进行实现,设置两个二维数组,一个打印结果,即为游戏界面显示的效果,一个用…...
第十节 使用设备树插件实现RGB 灯驱动
Linux4.4 以后引入了动态设备树(Dynamic DeviceTree),我们这里翻译为“设备树插件”。设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中,并被内核识别。例如我们要在系统中增加RGB 驱动,那么我们可以针对R…...
【LeetCode】公交路线 [H](宽度优先遍历)
815. 公交路线 - 力扣(LeetCode) 一、题目 给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。 例如,路线 routes[0] [1, 5, 7] 表示第 …...
报表生成器 FastReport .Net 用户指南 2023(十):Band的属性
FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…...
终极指南:5分钟学会免费修复Minecraft损坏存档的强力工具
终极指南:5分钟学会免费修复Minecraft损坏存档的强力工具 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraft-Reg…...
华为光猫配置解密工具全解析:从加密破解到网络运维实战指南
华为光猫配置解密工具全解析:从加密破解到网络运维实战指南 【免费下载链接】HuaWei-Optical-Network-Terminal-Decoder 项目地址: https://gitcode.com/gh_mirrors/hu/HuaWei-Optical-Network-Terminal-Decoder 在网络运维工作中,光猫设备的配置…...
苹果内购Java后端避坑指南:沙盒测试、凭据验证与订单防重的那些事儿
苹果内购Java后端避坑指南:沙盒测试、凭据验证与订单防重的那些事儿 第一次对接苹果应用内购(IAP)时,我以为按照官方文档走完流程就万事大吉了。直到凌晨三点收到服务器告警——重复充值、验证超时、沙盒环境漏测等问题接踵而至。…...
Android10音频系统实战:如何自定义音量曲线(附default_volume_tables.xml修改指南)
Android 10音频系统深度定制:音量曲线调优实战手册 在移动设备音频体验的精细打磨中,音量曲线的定制往往是最容易被忽视却至关重要的环节。作为一名长期从事Android系统定制的开发者,我曾为多款旗舰设备调整过音频参数,发现原厂音…...
颠覆式突破:无需模拟器,在Windows系统上直接运行Android应用的革命性方案
颠覆式突破:无需模拟器,在Windows系统上直接运行Android应用的革命性方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想象一下,…...
HunyuanVideo-Foley开发者指南:API封装、批量生成与二次开发接口详解
HunyuanVideo-Foley开发者指南:API封装、批量生成与二次开发接口详解 1. 镜像概述与环境准备 1.1 核心功能与硬件要求 HunyuanVideo-Foley是一款集视频生成与AI音效生成于一体的专业工具,本镜像针对RTX 4090D 24GB显卡进行了深度优化。主要功能包括&a…...
告别AI瞎编代码:手把手教你用Context7 MCP给Claude/Cursor装上“实时文档库”
告别AI幻觉代码:Context7 MCP与主流开发工具深度集成实战指南 每次看到AI助手生成那些无法运行的过时代码时,你是否也感到沮丧?作为深度依赖AI编程助手的开发者,我们都经历过这样的困境:花费数小时调试一段本不该出现的…...
OpenClaw备份恢复指南:ollama-QwQ-32B模型与技能迁移方案
OpenClaw备份恢复指南:ollama-QwQ-32B模型与技能迁移方案 1. 为什么需要备份恢复方案 上周我的主力开发机突然硬盘故障,导致整个OpenClaw环境丢失。最痛苦的不是重装软件,而是那些精心调教过的技能配置和任务历史记录全部归零。这次经历让我…...
企业级实验室信息管理系统:SENAITE LIMS 实战深度解析与部署指南
企业级实验室信息管理系统:SENAITE LIMS 实战深度解析与部署指南 【免费下载链接】senaite.lims SENAITE Meta Package 项目地址: https://gitcode.com/gh_mirrors/se/senaite.lims SENAITE LIMS 是一款基于 Plone 和 Python 构建的开源实验室信息管理系统&a…...
React篇——第一章 React的基础知识(上篇)
目录 1. React简介 1.1 什么是React 1.2 React的核心优势 组件化开发 虚拟DOM 丰富的生态系统 跨平台支持 1.3 React的市场地位 2. 开发环境搭建 2.1 使用create-react-app创建项目 2.2 其他创建React项目的方式 3. JSX基础 3.1 什么是JSX 3.2 JSX的优势 3.3 JS…...
