首页 > 数据库 >什么是 MySQL 锁等待?

什么是 MySQL 锁等待?

时间:2024-07-03 17:31:53浏览次数:8  
标签:slot 行锁 什么 链表 MySQL 表锁 等待 结构

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

某个周六,小明去找 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 的其它属性,不一一介绍了。
通知后台线程发生了锁等待。
完成以上步骤之后,登记过程就结束了。

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

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

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

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

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

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

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

锁等待超时了。
其它事务释放锁时,当前事务获得了锁。
解决死锁时,当前事务被选择成为受害者。
总结
锁等待的流程比较简单,主要步骤如下:

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

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

标签:slot,行锁,什么,链表,MySQL,表锁,等待,结构
From: https://www.cnblogs.com/pony100/p/18282250

相关文章

  • ETL数据集成丨使用ETLCloud实现MySQL与Greenplum数据同步
    我们在进行数据集成时,MySQL和Greenplum是比较常见的两个数据库,我们可以通过ETLCloud数据集成平台,可以快速实现MySQL数据库与数仓数据库(Greenplum)的数据同步。MySQL数据库:优点:轻量级与高性能:MySQL体积小、启动快,对资源消耗相对较低,适合处理高并发的OLTP(在线事务处理)场景。开源......
  • 服务-mysql
    目录安装范例:二进制安装mysql基础范例:mysql客户端登录,执行脚本范例:管理用户、权限,增改锁范例:查看默认字符集和排序规则常用SQL范例:数据库DDL:CREATE,DROP,ALTER范例:数据表DDL:CREATE,DROP,ALTER范例:DML:INSERT,DELETE,UPDATE范例:DQL单表查询语句范例:DQL多表子查询范例:DQL多表查......
  • 一个能解决95%定时任务问题的项目,这是什么级别的存在...(领私活源码)
     最近在做项目中涉及到了任务创建和任务运行。结合老大意思,想让我做一个单独的执行器服务。这就有些头疼了。整理起来也比较费事儿!打工人,不能轻易说不!于是就上网划水,突然间XXL-JOB就在我眼前闪过!了解下发现挺适合的。就这样故事开始了...XXL-JOB简介XXL-JOB是一个分......
  • Mysql中视图的使用以及常见运算符的使用示例和优先级
    场景基础知识回顾:mysql中视图的基础使用以及常见运算符的使用示例。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现Mysql中视图的使用视图的创建CREATEVIEWstu_viewASSELECT*FROMbus_student;视图查询SELECT*FROMstu_view;查看视图基本信息SHOWTAB......
  • MySQL 中 SQL 查询语句的执行顺序
    在MySQL中,SQL查询的执行顺序通常按照以下顺序进行:FROM:从指定的表中选择数据。WHERE:对数据进行筛选,只选择满足条件的行。GROUPBY:按照指定的列对数据进行分组。SELECT:选择要返回的列或表达式。HAVING:对分组后的数据进行筛选,只选择满足条件的分组。UNION[ALL]ORDERBY:对......
  • 苹果Mac电脑能玩什么游戏 Mac怎么运行Windows游戏
    相对于Windows平台来说,Mac电脑可玩的游戏较少。虽然苹果设备的性能足以支持各种大型游戏,但由于系统以及苹果配套服务的限制,很多游戏无法在Mac系统中运行。不过,借助虚拟机软件,Mac电脑可以突破系统限制玩更多的游戏。接下来,一起来看看苹果Mac电脑能玩什么游戏,Mac怎么运行Windows......
  • 什么是维持我们坚持下去的源动力?——人类大脑中的奖赏功能
    最近相信很多同学都处在找工作的焦虑与恐慌之中,当然我也不例外。当然这段时间除了准备找工作的事情外,也给了我一些更多的时间能整理一下研究生期间做过的一些工作,同样也能够有时间去思考一些问题。晚上坐在实验室里突然想到一个问题就是:什么是维持我们坚持下去的源动力?好像回答了......
  • 聚簇索引(MySQL-InnoDB引擎下)
    聚簇索引(MySQL-InnoDB引擎下)聚簇索引并不是一种单独的索引类型,而是一种存储方式。顾名思义,聚簇,使得数据行和相邻的键值紧促的存储在一起。(物理上的)聚簇索引的数据分布Mysql内置的存储引擎并不支持选择用于聚簇的索引,主键索引默认就是聚簇索引。聚簇索引的优点:1.可以将相互关......
  • Linux服务器安装MySQL数据库
    首先yum安装的版本比较低,所以先下载一个yum比较新的库文件点击就是下载到本地,如果想在Linux里面下载就需要右击复制链接1.安装MySQL:sudoaptupdatesudoaptinstallmysql-server2.可以通过sudosystemctlstatusmysql命令查看MySQL是否已启动3.设置登录密码......
  • TOGAF培训什么内容?参加TOGAF培训有什么好处?考试通过率多少?
    TOGAF培训什么内容?参加TOGAF培训有什么好处?考试通过率多少?TOGAF培训哪些内容?通过本课程,你将掌握TOGAF®的理论和实践,理解企业架构的影响,能够评估、启动、设计、执行新一轮企业和IT架构。能够与架构相关的利益相关人深入沟通,引导需求,并且深入理解IT治理和架构治理。......