MySQL 锁的内存结构

目录

1.摘要

2. 加锁的本质

3. 锁结构详解

3.1 锁所在的事务信息

3.2 索引信息

3.3 表锁/行锁信息

3.4 type_mode

3.5 其他信息

3.6 一堆比特位


1.摘要

在 MySQL 中,有很多种锁,例如行锁,表锁,页锁,全局锁,它们锁的粒度都不一样。更多情况下,我们只是关注这些锁的区别和作用,却很少关注它们本身,本篇我们就来简单了解一下MySQL 中锁的内存结构,锁中都包含了哪些信息。

2. 加锁的本质

在 Java 中,我们对一个代码块或一个方法进行加锁,锁住的都是唯一资源,是需要多个线程去进行争抢的;而在MySQL中,我们对一行记录去进行加锁,实质上是在内存结构中创建了一个锁结构与之相关联。

但这样就会出现一个问题。如果一个事务要对多条记录进行加锁,难道要生成多个锁结构吗?如果数据量过多,锁结构也随之增多,会出现大量的冗余,这么做合理吗?

当然是不合理的。因此,MySQL在对不同的记录进行加锁时,会对需要加锁的记录去做判断,如果符合下面这些条件,就会放在同一个锁结构中。

(一)在同一个事务中进行加锁操作;

(二)被加锁的记录在同一个页面中;

(三)加锁的类型是一样的;

(四)等待的状态是一样的;

可以先简单及以下这四句话,下面我会进行详细说明。

3. 锁结构详解

MySQL中有很多种存储引擎,这里我们以最为常用的InnoDB存储引擎为例说明,这也是因为只有InnoDB存储引擎支持行级锁。InnoDB存储引擎的锁结构如下所示,行级锁与表级锁的锁信息略有不同,其余信息都是一样的。

3.1 锁所在的事务信息

记录操作当前数据的事务信息(这里只是一个指针,通过指针我们可以获取当前事务的详细信息,例如事物的id,事务的隔离级别);

3.2 索引信息

对于行锁来说,需要记录加锁的记录属于哪个索引,这里也是一个指针;

3.3 表锁/行锁信息

表锁结构和行锁结构略有不同。表锁主要记录对那个表进行加锁;   行锁则记录了三个重要信息,分别是 表空间Space ID,页号Page Number,n_bits(对于行锁来说,一条记录就对应着一个比特位,一个页面中包含很多记录,用不同的比特位来区分到底是哪一条记录加了锁。为此在行锁结构的末尾放置了一堆比特位,这个n_bits属性代表使用了多少比特位,这里只是一个记录数,但不存放真正的比特位,真正的比特位是由最下面"一堆比特位"存放的);

3.4 type_mode

锁的模式(lock_mode)占用了低四位,可选值如下

LOCK_IS(十进制的0):表示共享意向锁,即 IS锁;

LOCK_IX(十进制的1):表示独占意向锁,即 IX锁;

LOCK_S(十进制的2):表示共享锁,即 S锁;

LOCK_X(十进制的3):表示独占锁,即 X锁;

LOCK_AUTO_INC(十进制的4):表示 AUTO-INC锁;

在InnoDB存储引擎中,LOCK_IS,LOCK_IX,LOCK_AUTO_INC 都算是表级锁的模式,LOCK_S,LOCK_X 既可以算是表级锁模式,也可以算作行级锁模式

锁的类型(lock_type),占用了第5~8位,不过现阶段只有第5位和第6位被使用:

LOCK_TABLE(十进制的16):也就是第5个比特位为1时,表示表级锁;

LOCK_REC(十进制的32):也就是第6个比特位为1时,表示行级锁;

锁的具体行为(rec_lock_type):使用其余位表示,只有在lock_type 值为LOCK_REC时,也就是该锁为行级锁时,才会细分为更多的类型,如下

LOCK_ORDINARY(十进制的8):表示 next-key 锁;

LOCK_GAP(十进制的512):也就是当第十个比特位为1时,表示GAP锁;

LOCK_REC_NOT_GAP(十进制的1024):即当第11个比特位为1时,表示正经记录锁;

LOCK_INSERT_INTENTION(十进制的2048):即当第12个比特位为1时,表示插入意向锁

:也在这个32位数字中;

LOCK_WAIT(十进制的256):即我们上面提到的等待状态,IS_WAITING(是否处于等待状态)表示第九个比特位为1时,为true,当前事务还尚未获取到锁,正处于等待状态;为0即false时,表示当前事务获取锁成功;

3.5 其他信息

为了更好地管理系统运行过程中生成的各种锁结构而设计了各种哈希表和链表;

3.6 一堆比特位

对应上面第三条行锁信息,在行锁结构中,末尾还放置了一堆比特位,比特位的数量就是有上面的 n_bits 来决定的,InnoDB数据页中的每条记录在记录头信息中都包含了一个heap_no 属性,伪记录Infimum的heap_no值为0,Supermum的heap_no值为1,之后插入每条记录,heap_no的值就增加1。锁结构最后的一堆比特位就对应着一个页面中的记录,一个比特位映射一个heap_no,即一个比特位映射到业内的一条记录。

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

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

相关文章

MyBatis Plus:自定义typeHandler类型处理器

目录 引言:关于TypeHandler PostGreSQL:JSON数据类型 PostGreSQL数据库驱动:PGobject类 TypeHandler类型处理器 自定义类型处理器 类型处理器实现:PGJsonTypeHandler 注册类型处理器 引言:关于TypeHandler MyBa…

Sui在Dacade推出Move课程,完成学习奖励SUI

Dacade推出了一门Sui开发者课程,通过一系列引人入胜的挑战,为开发者提供了一个沉浸式的Move技术之旅。在这门课程中,Dacade的教育材料将引导用户利用Sui强大的DeFi原生功能(包括DeepBook和zkLogin)构建DeFi应用。此外&…

提升VR全景摄影画质的8个因素

如今VR全景拍摄的门槛已经很低,包括无人机、全景相机等都具有一键全景的功能。很多初次接触VR全景拍摄的朋友会发现同样的设备,为啥拍出来的效果就不如别人呢? 其实,要提升VR全景拍摄质量,只需要了解以下几个环节&…

基于多种机器学习模型的西北地区蒸散发模拟与趋势分析_季鹏_2023

基于多种机器学习模型的西北地区蒸散发模拟与趋势分析_季鹏_2023 摘要关键词 1 资料和方法1. 1 研究区域与观测数据1. 2 机器学习模型构建与验证方法1. 3 SHAP 可解释性方法 2 主要结果2. 1 不同模型的模拟性能和泛化能力2. 2 不同模型的可解释性分析2. 3 5 km 分辨率格点蒸散发…

鸿蒙Next怎么升级,有便捷的方法?

早在2023年11月,市场上有自媒体博主表示,华为HarmonyOS NEXT的升级计划是2X年底到2X年初完成一亿部,2X年底完成三亿部。虽然该博主没有明确具体年份,但预计是2024年底2025年初升级一亿部HarmonyOS NEXT设备,2025年底完…

上门服务小程序系统|多元化服务和高效便捷的服务体验

现代社会的快节奏生活让人们越来越追求便捷与效率,而上门服务系统应运而生,成为了现代人生活中的新选择。通过在家就能享受各种服务,不仅省时省力,还能提供个性化的服务体验。 上门服务系统的出现,使得各类家政、维修…

盲盒小程序开发,线上盲盒平台的发展潜力

盲盒的出现给大众带来了全新的消费体验,目前,盲盒经济也是席卷了当代年轻人,一种新的商业模式就此出现。盲盒的玩法、种类也在不断创新进化,成为了吸引大众的消费形式。 当然,在当下盲盒稳步发展时期,也要…

Collection集合体系(ArrayList,LinekdList,HashSet,LinkedHashSet,TreeSet,Collections)

目录 一.Collection 二.List集合 三.ArrayList集合 四.LinkedList集合 五.Set集合 六.hashSet集合 七.LinkedHashSet集合 八.TreeSet集合 九.集合工具类Collections 集合体系概述 单列集合:Collection代表单列集合,每个元素&#…

onlyoffice基础环境搭建+部署+demo可直接运行 最简单的入门

office这个体系分为四个大教程 1、【document server文档服务器基础搭建】 2、【连接器(connector)或者jsApi调用操作office】-进阶 3、【document builder文档构造器使用】-进阶 4、【Conversion API(文档转化服务)】-进阶 如果需要连接器,可以查看:onl…

IO进程线程day4

1.思维导图 2.使用多进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;父进程回收子进程的资源。 #include<myhead.h>int main(int argc, const char *argv[]) {//判断终端输入的参数是否合法if(argc!3){printf("input…

计算机网络Day1--计算机网络体系

1.三网合一 电信网络、广播电视网络、计算机网络&#xff08;最基础最重要发展最快&#xff09; 2.Internet 名为国际互联网、因特网&#xff0c;指当前全球最大的、开放的、由众多网络相互连接而成的特定互连网&#xff0c;采用TCP/IP 协议族作为通信的规则&#xff0c;前…

stm32——hal库学习笔记(定时器)

这里写目录标题 一、定时器概述&#xff08;了解&#xff09;1.1&#xff0c;软件定时原理1.2&#xff0c;定时器定时原理1.3&#xff0c;STM32定时器分类1.4&#xff0c;STM32定时器特性表1.5&#xff0c;STM32基本、通用、高级定时器的功能整体区别 二、基本定时器&#xff0…

【C++】1143 - 纯粹合数

问题 一个合数&#xff0c;去掉最低位&#xff0c;剩下的数仍是合数&#xff0c;再去掉剩下的数的最低位&#xff0c;余留下来的数还是合数&#xff0c;这样反复&#xff0c;一直到最后剩下的一位数仍是合数&#xff1b;我们把这样的数称为纯粹合数。求所有的三位纯粹合数。 1…

多目图像拼接算法

图像拼接一般要经过图像特征提取、特征匹配、融合等步骤来实现。 特征匹配与变换: SIFT(尺度不变特征变换)SURF(加速鲁棒特征)ORB(Oriented FAST and Rotated BRIEF)AKAZE(加速的KAZE特征)全景图像拼接算法: 基于特征匹配的拼接:利用特征点匹配找到重叠区域,然后进…

YOLO-World:实时开放词汇目标检测

paper&#xff1a;https://arxiv.org/pdf/2401.17270.pdf Github&#xff1a;GitHub - AILab-CVC/YOLO-World: Real-Time Open-Vocabulary Object Detection online demo&#xff1a;https://huggingface.co/spaces/stevengrove/YOLO-World 目录 0. 摘要 1. 引言 2. 相关工…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-WatchDog

目录 一、 WATCHDOG 概述功能简介基本概念 二、WATCHDOG 模块相关API三、WATCHDOG HDF驱动开发3.1、开发步骤(待续...) 坚持就有收获 一、 WATCHDOG 概述 功能简介 看门狗&#xff08;Watchdog&#xff09;&#xff0c;又称看门狗计时器&#xff08;Watchdog timer&#xff0…

C++ 之LeetCode刷题记录(三十二)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 7. 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后…

阿赵UE学习笔记——16、渲染性能相关

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。上一篇说了灯光的移动性问题&#xff0c;这一篇来看看怎样去辨别灯光性能的好坏。   虚幻引擎里面有一组显示模式是专门用来看场景当前的灯光和网格渲染的&#xff0c;叫做优化试图模式&#x…

【Vue】fabricjs 实现局部截图及el-image-viewer大图预览

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>使用fabric.js裁剪和显示图片</title> <script src"https://cdnjs.cloudflare.com/ajax/libs/fabric.js/4.5.0/fabric.min.js"…

adb-环境安装

1. 下载解压包&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固&#xff0c;支持教育网加速&#xff0c;支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1TDu2fzGbqCyug3wCSmV9oQ?pwd…