什么是 MySQL 锁等待?

news2024/10/7 18:22:52

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

1. 先排队

不管是加表锁,还是加行锁,如果不能立即获得锁,加锁事务都需要进入锁等待状态。

事务进入锁等待状态,需要用锁结构来排队。和立即获得锁时的锁结构一样,这个锁结构的各属性都已经初始化完成。不同之处在于,它被设置为等待状态。

表锁、行锁处于等待状态时,都不能共用锁结构,而是需要申请一个新的锁结构。

每个事务对象初始化时,会预先创建 8 个表锁结构、8 个行锁结构。

事务执行过程中加锁,需要申请新的锁结构时,如果预先创建的表锁结构、行锁结构还有空闲的,可以直接找一个对应的空闲锁结构来使用,没有空闲的,则需要创建一个对应的锁结构。

事务拿到新的锁结构之后,会把 type_mode 属性的第 9 位设置为 1,表示这个锁结构处于等待状态。

关于申请新的表锁结构、行锁结构的详细逻辑,以及各属性的初始化,可以看前面对应的文章,这里不再赘述。

锁结构的各属性初始化完成之后,加锁事务就具备加入排队大军的条件了。

多个事务对同一个表加表锁,每个事务都会申请一个表锁结构。这些表锁结构通过各自的 locks 属性形成一个链表,我们称之为 locks 链表

对于表锁,锁结构加入表对象的 locks 链表的末尾,排队过程就开始了。

多个事务对同一个数据页中的记录加行锁,一个事务对多个数据页中的记录加行锁,也会申请多个行锁结构。

映射到 rec_hash 的数组中同一个单元的多个行锁结构,通过各自的 hash 属性形成一个链表。

处于等待状态的行锁结构,加入这个链表的末尾,排队过程也就开始了。

同一个事务创建的一个或多个表锁结构、一个或多个行锁结构,通过各自的 trx_locks 属性形成一个链表,我们称之为 trx_locks 链表

不管是表锁结构,还是行锁结构,都需要加入 trx_locks 链表。表锁结构会加入链表的头部,行锁结构会加入链表的末尾。

2. 再登记

开始排队之后,跟着队伍慢慢前进,等轮到自己获得锁不就行了,又搞出来个登记,岂不是多此一举?

我们可以通过生活中的场景来理解一下为什么要弄个登记逻辑。

某个周六,小明去找 Tony 老师剪头发。

距店一步之遥时,打眼一看:咦?店里没什么人,来的正是时候。

正美着呢,到了店门口,有个热情的小哥出来迎接。

小哥笑着说:哥,来拿个号。

小明面露不悦之色,嘀咕道:都没什么人,还拿什么号?

小哥依然笑魇如花,解释说:今天人很多,要等挺长时间。好多人不想干等,拿了号排队,留下手机号之后,都去逛了。快轮到他们时,我就打电话通知他们来。

听小哥说完,小明也只好拿了号排队,留下手机号,逛去了(看!他拉着谁的手?)。

书归正传,和上面的场景一样,加锁需要等待时,也要先排个队,然后登个记。

锁等待的登记,当然不是留手机号了,而是找到一个 slot,再把加锁的相关信息记录到这个 slot 的对象中。

前面介绍锁模块的初始化时,我们知道了锁模块有个 waiting_threads 属性,指向一片内存区域。

这片内存区域有 srv_max_n_threads 个 slot,每个 slot 存放一个 srv_slot_t 对象。

锁等待时,InnoDB 会从 waiting_threads 指向的第一个 slot 开始遍历,碰到第一个空闲的 slot(in_use 属性值为 false),就登记上。

登记的主要步骤如下:

  • slot 的 in_use 属性值修改为 true,表示这个 slot 不再空闲。
  • 锁等待的超时时间保存到 wait_timeout 属性中,供后台线程检查锁等待超时使用。
  • 修改 slot 的其它属性,不一一介绍了。
  • 通知后台线程发生了锁等待。

完成以上步骤之后,登记过程就结束了。

3. 坐等通知

登记完成之后,就可以坐等通知了吗?

别急,还有一件小小的情况需要做。

如果本次加的是行锁,InnoDB 还需要记录锁等待的开始时间,这个开始时间就是当前时间。

如果本次加的是表锁,不会记录锁等待的开始时间,因为 server 层触发 InnoDB 加表锁时,锁等待的开始时间由 server 层记录。

InnoDB 自己发起的加表锁操作,不计算锁等待消耗的时间,也就不需要记录开始时间了。

记录锁等待的开始时间这件小事完成了,就可以坐等通知了。

发生以下事件时,锁等待的事务会收到通知:

  • 锁等待超时了。
  • 其它事务释放锁时,当前事务获得了锁。
  • 解决死锁时,当前事务被选择成为受害者。

4. 总结

锁等待的流程比较简单,主要步骤如下:

  • 申请一个锁结构,加入链表,开始排队。
  • 找到一个空闲的 slot,把加锁的相关信息记录到这个 slot 的对象中,完成登记工作。
  • 如果加的是行锁,还需要记录锁等待的开始时间。
  • 坐等通知。

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

关于 SQLE

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

✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

👥 微信群:请添加小助手加入 ActionOpenSource

🔗 商业支持:https://www.actionsky.com/sqle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1889401.html

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

相关文章

【Python+微信小程序】学生考勤签到系统(已开源)

1. 简介 😝 这个项目是一款基于微信小程序和Flask框架开发的应用,旨在帮助学校管理学生的考勤和课程信息。系统通过集成数据库管理、API开发以及前后端交互,实现了便捷的学生考勤记录、课程表管理和教师交互功能。其主要特点包括&#xff1a…

intellij idea中使用R语言plot画图无图像问题

1、在intellij idea中使用R语言plot函数时,会遇到各种各样的问题,会出现图片不显示问题, 可以看到,目前我电脑r语言版本为4.2.1,输入下面代码: # # 安装包 # install.packages(ggplot2) # library(ggplot2…

AI是在帮助开发者还是取代他们

目录 1.概述 1.1.AI助力开发者 1.2.AI对开发者的挑战 2.AI工具现状 2.1. GitHub Copilot 2.2. TabNine 2.3.小结 3.AI对开发者的影响 3.1.对开发者的影响 3.2.开发者需要掌握的新技能 3.3.在AI辅助的环境中保持竞争力的策略 4.AI开发的未来 5.总结 1.概述 生成式…

【VScode】常用配置

1.indenticator 增加白色竖条,显示方法范围 2.Git Graph 给git变换分支增添颜色区分 3.Vue 系列 vue 系列:给纯白色代码添加 颜色区分 3.eslint eslint警告,比如{ } 只写了半个会标红提示错误 等错误信息提示 需要配置js等页面 非下…

使用CiteSpace软件对知网文献进行关键词共现/聚类/突现分析

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【前端】vue 报错:The template root requires exactly one element

【前端】vue 报错:The template root requires exactly one element 写在最前面Prettier - Code formatter插件解决 Vue 报错:The template root requires exactly one element错误原因示例 解决方法更复杂的示例使用 Fragment 解决问题 小结 &#x1f3…

深度学习——卷积神经网络(convolutional neural network)CNN详解(一)——概述. 步骤清晰0基础可看

在CNN的学习过程中我会提供相应的手算例子帮助理解训练过程。 其他关于神经网络的学习链接如下: 一、了解卷积神经网络 卷积神经网络的作用 总的来说,卷积神经网络的第一个主要作用是对图像进行特征提取,所谓特征提取,就是明白…

亚马逊测评策略全攻略:详析各方案优势与局限,你精通了吗?

亚马逊测评,一个绕不开的话题。不管是对于新手卖家还是资深卖家来说,它都是提升产品销量和排名的有效手段之一。接下来,我将为大家详细解析亚马逊测评的各种方式和注意事项。 一、精准筛选真人测评资源 在寻找真人测评资源时,许多…

【深度学习】扫描全能王的AI驱动创新与智能高清滤镜技术解析

目录 引言1、扫描全能王2、智能高清滤镜黑科技2.1、图像视觉矫正2.2、去干扰技术 3、实际应用案例3.1、打印文稿褶皱检测3.2、试卷擦除手写3.3、老旧文件处理3.4、收银小票3.5、从不同角度扫描文档 4、用户体验结论与未来展望 引言 在数字化时代背景下,文档扫描功能…

记录一次MySQL恢复

一、前言 此文章由一次数据库被黑客删除而引发 由于对于Linux操作、docker使用、MySQL原理这些都相对不是很熟悉,所以记录下来避免以后在工作中遇到类似的问题而惊慌失措。 1.MySQL环境现状 docker管理的,8.0.26版本 启动语句: docker run -d -p 33…

python pdfplumber优化表格提取

样例pdf 直接使用文本提取效果: 使用表格提取 根据提取的文本信息是没办法获取到表格数据的,太乱了。尤其是 3 4列。 解决: 自行画线,根据画线进行提取。 效果: 思路: 1.根据表头进行画竖线 2.根据行坐…

vue3 ~ pinia学习

先看两个图 一个vuex 一个pinia 根据图看出来 pinia更简单了 那么具体怎么操作呢 我们来看下~ 第一步 下载 yarn add pinia # 或者使用 npm npm install pinia 第二步 注册 创建一个 pinia 实例 (根 store) 并将其传递给应用: import { createApp } from v…

vue的$nextTick是什么是干什么用的?

为什么需要使用$nextTick?他的使用场景 1.你在接口返回之后在获取高度 正常等页面加载在mounted这个钩子函数里 这时候就需要找到接口赋值的地方 这样就可以获取到数据操作以后的dom元素了 $nextTick是什么是干什么用的? $nextTick() 是 Vue.js 框…

超详细:安装Linux系统、虚拟现实教程

文章目录 一、如何下载并使用VMware虚拟机1.百度搜索vmware2.进入官网点击Workstation Pro链接3.博通注册对应的账号4.博通填写用户名、密码后直接登录会跳转到博通登录页5.个人使用选择个人版 二、国内镜像网站下载(Centos版本)三、镜像系统的安装1.打开…

【等保2.0的内容有哪些?】

“在“等保2.0”的基础上,分别增加了云计算安全、移动互联安全、物联网安全、工控系统安全、大数据安全5个拓展需求。 《中华人民共和国刑法》第253条,非法将公民个人资料卖给他人,并处罚金。 违反国家相关法律法规,将其在执行公…

计算机系统基础(三)

1.程序转换概述 机器指令和汇编指令 机器指令与汇编指令意义对应,都是机器级指令 汇编指令 如:M[R[bx]R[di]-6]←R[cl] R:寄存器内容 M:存储单元内容 机器指令 高级语言转换为机器代码的过程 根据计算机系统基础&#xff…

KEYSIGHT是德科技 E5063A ENA 系列网络分析仪

E5063A ENA 矢量网络分析仪 18GHz 2端口 降低无源射频元器件的测试成本 Keysight E5063A ENA 是一款经济适用的台式矢量网络分析仪,可用于测试简单的无源元器件,例如频率最高达到 18 GHz 的天线、滤波器、电缆或连接器。 作为业界闻名的 ENA 系列…

MLLM QLoRA微调实战:基于最新的袖珍Mini-InternVL模型

引言 大型语言模型(LLM)的世界正在不断发展,新的进步正在迅速出现。一个令人兴奋的领域是多模态LLM(MLLMs)的发展,这种模型既能够理解文本又能够理解图像,并与之进行交互。因此,这种…

ATG-2032:功率信号源的类型及应用领域简介

功率信号源是一种产生稳定、精确且可调节的电力信号的仪器,其主要作用是为测试和校准各种电子设备提供标准信号,以确保设备的精度和稳定性。 图:ATG-2000系列功率信号源 以下是功率信号源的主要类型和作用: 直流功率信号源 直流功…

Unity游戏帧率查看软件Fraps

Download Fraps 3.5.99 free version 下载、安装、运行这个软件,左上角就会自动显示帧率