MySQL 核心模块揭秘 | 03 期 | 我是一个事务,请给我一个对象

2024-01-21

每个事务都有一个对象,这篇文章我们聊聊,事务的对象从哪里来,要到哪里去。

作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

在这里插入图片描述

本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。

1. 用户事务和内部事务

InnoDB 读写表中数据的操作都在事务中执行,开始一个事务的方式有两种:

  • 手动:通过 BEGIN START TRANSACTION 语句以及它们的扩展形式开始一个事务。
  • 自动:直接执行一条 SQL 语句,InnoDB 会自动开始一个事务,SQL 语句执行完成之后,又会自动提交这个事务。

这两种方式开始的事务,都用来执行用户 SQL 语句,属于 用户事务

InnoDB 有时候也需要自己执行一些 SQL 语句,为了和用户 SQL 做区分,我们把这些 SQL 称为内部 SQL。

内部 SQL 也需要在事务中执行,执行这些 SQL 的事务就是 内部事务

InnoDB 有几种场景会使用内部事务,以下是其中主要的三种:

  • 如果上次关闭 MySQL 时有未提交,或者正在提交但未提交完成的事务,启动过程中,InnoDB 会把这些事务恢复为内部事务,然后提交或者回滚。
  • 后台线程执行一些操作时,需要在内部事务中执行内部 SQL。

    以 ib_dict_stats 线程为例,它计算各表、索引的统计信息之后,会使用内部事务执行内部 SQL,更新 mysql.innodb_table_stats、mysql.innodb_index_stats 表中的统计信息。
  • 为了实现原子操作,DDL 语句执行过程中,InnoDB 会使用内部事务执行内部 SQL,插入一些数据到 mysql.innodb_ddl_log 表中。

2. 分配事务对象

InnoDB 用事务池来管理事务对象,用事务池管理器来管理事务池。

不管是用户事务,还是内部事务,真正启动事务之前,都需要通过事务池管理器从某个事务池的 事务队列 中分配一个事务对象。

已经创建的那些事务池,都放在事务池管理器的 m_pools 数组中。分配事务对象时,先从第 1 个事务池开始,过程是这样的:

  • 如果事务池的事务队列中有可用的事务对象,直接分配一个就好了。
  • 否则,看看事务池中还有没有未初始化的小块内存。
  • 如果有,那就好办了,把这些小块内存全部初始化,得到的事务对象都放入该事务池的事务队列,并从中分配一个事务对象。
  • 否则,继续对下一个事务池,走一遍上面的流程。
  • 要是没有下一个事务池,怎么办?
  • 也好办,那就创建一个新事务池,初始化之后,就可以直接从它的事务队列中分配一个事务对象了。

3. 再做一些初始化工作

分配一个事务对象,得到的是一个出厂设置的对象,这个对象的各属性值都已经是初始状态了。

分配事务对象之后,InnoDB 还会对事务对象的几个属性再做一次初始化工作,把这几个属性再一次设置为初始值,其实就是对这些属性做了重复的赋值操作。

这些属性中,有必要提一下的是事务状态( trx->state )。出厂设置的事务对象,事务状态是 TRX_STATE_NOT_STARTED ,表示事务还没有开始。

我们执行 show engine innodb status 可能会看到类似下面的内容:

LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 281480261177256, not started
0 lock struct(s), heap size 1192, 0 row lock(s)

其中, not started 就来源于事务的 TRX_STATE_NOT_STARTED 状态。

除了给几个属性重复赋值,还会改变另外两个属性的值:

  • trx->in_innodb:给这个属性值加上 TRX_FORCE_ROLLBACK_DISABLE 标志,防止这个事务被其它线程触发回滚操作。事务后续执行过程中,这个标志可能会被清除,我们就不展开介绍了。
  • trx->lock.autoinc_locks:分配一块内存空间,用于存放 autoinc 锁结构。事务执行过程中需要为 auto_increment 字段生成自增值时使用。

4. 加入事务链表

我们查询 information_schema.innodb_trx 表,能看到当前正在执行的事务有哪些,这些事务来源于两个链表。

为用户事务分配一个事务对象之后,还有一件非常重要的事,就是把事务对象放入其中一个链表的最前面,代码是这样的:

UT_LIST_ADD_FIRST(trx_sys->mysql_trx_list, trx);

从上面的代码可以看到,这个链表就是 trx_sys->mysql_trx_list ,它只会记录用户事务。

至于内部事务,并不会放入 trx_sys->mysql_trx_list 链表。等到真正启动事务时,事务对象会被放入另一个链表,我们先按下不表,留个悬念,后面的内容会介绍。

5. 总结

InnoDB 把事务分为用户事务和内部事务,给事务分配对象时,会按照这个顺序:

  • 先从事务池的事务队列中分配一个对象。
  • 如果事务队列中没有可用的事务对象,就初始化事务池的剩余小块内存,从得到的事务对象中分配一个对象。
  • 如果所有事务池都没有剩余未初始化的小块内存,就创建一个新的事务池,并从中分配一个事务对象。

本期问题 :InnoDB 怎么没有把内部事务也放入 trx_sys->mysql_trx_list 链表?欢迎大家留言交流。

下期预告 :准备那么久,终于要启动 InnoDB 事务了。

更多技术文章,请访问: https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型 地址
版本库 https://github.com/actiontech/sqle
文档 https://actiontech.github.io/sqle-docs/
发布信息 https://github.com/actiontech/sqle/releases
数据审核插件开发文档 https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 核心模块揭秘 | 03 期 | 我是一个事务,请给我一个对象 的相关文章

  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • MySQL 全文搜索不适用于某些单词,例如“house”

    我已经在 3 个字段中的一小部分记录上设置了全文索引 也尝试了 3 个字段的组合 并得到了相同的结果 有些单词返回结果很好 但某些单词如 house 和 澳大利亚 不这样做 有趣的是 澳大利亚 和 家乡 这样做 这似乎是奇怪的行为 如果我添
  • 如何以最少的查询次数获取帖子列表和关联标签

    我的表格结构如下 标签 更多的是一个类别 id 标签名称 描述 slug POSTS ID 标题 网址 邮戳 id idPost idTag USERS ID 用户名 userSlug VOTES id idPost idUser 每个帖子
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 为什么 MySQL 创建带有 _seq 后缀的表?

    我创建了一个 InnoDB 表 名为foo在 MySQL 中 一旦我对表执行插入操作 我就会看到另一个表foo seq被建造 如果我删除自动生成的表 它会在下一次插入后出现 是什么原因造成的 听起来像是正在创建一个序列 您是否有自动生成的主
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 为什么这会返回资源 id #2? [复制]

    这个问题在这里已经有答案了 可能的重复 我如何从 PHP 中的 MySql 响应中 回显 资源 id 6 https stackoverflow com questions 4290108 how do i echo a resource
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MySQL连接字符集问题

    我在 Mac 上使用带有 MySQL 的 velosurf 没有任何编码问题 但是当我切换到 Linux 计算机时 从 velosurf 获得的值未正确编码 我发现这可能是默认连接字符集的问题 在 Mac 上我得到 mysql gt sho
  • 比特纳米。重置mysql根密码

    我如何重置 MySQL 中的 root 密码和帐户 因为我按照如何为其他服务器授予权限的说明操作 并且意外地将 root 用户 Mysql 绑定到其他 IP 地址 现在看来我无法在 localhost 上以管理员身份登录 Thanks 您有
  • PDO PHP 连接,致命错误

    我的连接类 firstcode php class DB functions public db function construct try db new PDO mysql localhost dbname xxx charset ut
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希

随机推荐

  • 基于opencv的大米计数统计(详细处理流程+代码)

    在我每周的标准作业清单中 有一项是编写计算机视觉算法来计算该图像中米粒的数量 因此 当我的一个好朋友M给我发了一张纸上的扁豆照片 显然是受到上述转发的启发 请我帮他数一下谷物的数量时 它勾起了我怀旧的回忆 因此 我在我的旧硬盘上寻找很久以前
  • 渗透测试常用工具汇总_渗透测试实战

    1 Wireshark Wireshark 前称Ethereal 是一个网络分包分析软件 是世界上使用最多的网络协议分析器 Wireshark 兼容所有主要的操作系统 如 Windows Linux macOS 和 Solaris kali
  • 网络安全基础知识面试题库

    1 基于路由器的攻击手段 1 1 源IP地址欺骗式攻击 入侵者从外部传输一个伪装成来自内部主机的数据包 数据包的IP是 内网的合法IP 对策 丢弃所有来自路由器外端口 却使用内部源地址的数据包 1 2 源路由攻击 入侵者让数据包循着一个不可
  • 毕业设计- 基于深度学习的小样本时间序列预测算法 - Attention

    目录 前言 课题背景与意义 课题实现 一 数据集 二 设计思路 三 相关代码示例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校
  • 毕业设计:基于卷积神经网络的验证码识别系统 机器视觉 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 字符分割算法 2 2 深度学习 三 检测的实现 3 1 数据集 3 2 实验环境搭建 3 3 实验及结果分析 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实
  • 毕业设计:基于深度学习的微博谣言检测系统 人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 三 检测的实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有
  • 还在手工标注数据集?快来试一试自动化多模型标注大模型-gui交互式标注(部署运行教程-高效生产力)

    快速入门指南 先看一下自动化标注的强大 简直医学图像处理的福音呀 不仅如此 任何区域都可以识别到 面对任意开集数据 都可以达到良好的效果 运行模式 目前 X AnyLabeling 支持两种运行方式 一种是下载源码直接运行 另一种是直接下载
  • 【毕业设计选题】复杂背景下的无人机(UVA)夜间目标检测系统 python 人工智能 深度学习

    前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大家顺利通过和节省时间
  • 无人机视角、多模态、模型剪枝、国产AI芯片部署

    无人机视角 多模态 模型剪枝 国产AI芯片部署是当前无人机技术领域的重要研究方向 其原理和应用价值在以下几个方面进行详细讲述 一 无人机视角 无人机视角是指在无人机上搭载摄像头等设备 通过航拍图像获取环境信息 并进行图像处理和分析 这种技术
  • 网络安全:绕过 MSF 的一次渗透测试

    这次渗透的主站是 一个 Discuz 3 4 的搭建 违法招 piao 网站 配置有宝塔 WAF 用 Discuz ML 3 X 的漏洞进行攻击 但是没有成功 发现主站外链会有一个发卡网 引导人们来这充值 是 某某发卡网 而且域名指向也是主
  • 毕业设计:基于卷积神经网络的图像分类系统 python人工智能

    目录 前言 设计思路 一 课题背景与意义 二 算法理论原理 2 1 卷积神经网络 2 2 SVM算法 三 检测的实现 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • 台积电再被坑,2纳米光刻机优先给Intel和三星,美国太霸道了

    外媒指出今年ASML的10台2纳米光刻机分配已经基本确定了 Intel拿到6台 三星获得3台 台积电只能得到一台 考虑到美国对ASML的强大影响力 外媒的这些消息应该有较高的可信性 Intel在先进工艺制程方面 自从2014年量产14纳米之
  • iPhone成中国市场2023年最畅销手机,但国产手机已雄起

    苹果首次夺下国内手机市场年度第一名 iPhone成中国市场最畅销的手机 这个话题突然热起来 其实iPhone一直都是中国市场最畅销的手机啊 不过2023年Q4显示出国产手机已经雄起啦 苹果在2023年首次夺下中国手机市场年度第一名 这对苹果
  • 【计算机毕业设计】OA公文发文管理系统_xtv98

    近年来 人们的生活方式以网络为主题不断进化 OA公文发文管理就是其中的一部分 现在 无论是大型的还是小型的网站 都随处可见 不知不觉中已经成为我们生活中不可或缺的存在 随着社会的发展 除了对系统的需求外 我们还要促进经济发展 提高工作效率
  • 华为重夺第一,竞争对手就降价,这真的是巧合么?

    2024年Q4某国产手机品牌重夺国产手机品牌第一名 不过2024年开年第一周 国内手机市场的格局再次大变 华为夺下了第一名 不仅超越众多国产手机品牌 还超过了苹果 给国内手机市场带来震动 首先降价的是苹果 苹果的iPhone15自去年上市以
  • 回乡翻新父辈房子成部分年轻人的选择,低成本的田园生活

    独家首发 所谓城市套路深 我要回农村 这个或许只是一部分人的调侃 然而却有一部分年轻人做出这样的选择 不过他们又不希望花费太大成本 如此一些年轻人就选择翻新父母留下的旧房子 对于这部分年轻人来说 其实这也是一种不错的选择 城市里生活压力大
  • 性能大减80%,英伟达芯片在华“遇冷”,我方霸气回应:不强求

    中国这么大一块市场 谁看了不眼馋 在科技实力大于一切的今天 高端芯片的重要性不言而喻 作为半导体产业发展过程中不可或缺的一环 芯片技术也一直是我国技术发展的一大 心病 在美西方等国的联手压制下 我国芯片技术发展处处受阻 至今也未能在高端芯片
  • 作物叶片病害识别系统

    介绍 由于植物疾病的检测在农业领域中起着重要作用 因为植物疾病是相当自然的现象 如果在这个领域不采取适当的护理措施 就会对植物产生严重影响 进而影响相关产品的质量 数量或产量 植物疾病会引起疾病的周期性爆发 导致大规模死亡 这些问题需要在初
  • 京东001号快递员,刘强东给的买房承诺,仅4年时间就实现了

    京东001号快递员金宜财正式退休 不知是有意还是无意 他成为了互联网的热搜 不过大众更关心的是金宜财当年得到刘强东的承诺 只要干几年就能买房 那么刘强东的承诺有没有实现 又是如何实现的呢 据悉当年京东刚开始推京东快递的时候 京东还没什么名气
  • MySQL 核心模块揭秘 | 03 期 | 我是一个事务,请给我一个对象

    每个事务都有一个对象 这篇文章我们聊聊 事务的对象从哪里来 要到哪里去 作者 操盛春 爱可生技术专家 公众号 一树一溪 作者 专注于研究 MySQL 和 OceanBase 源码 爱可生开源社区出品 原创内容未经授权不得随意使用 转载请联系