MySQL 锁的内存结构

这篇具有很好参考价值的文章主要介绍了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存储引擎的锁结构如下所示,行级锁与表级锁的锁信息略有不同,其余信息都是一样的。

MySQL 锁的内存结构,mysql,数据库

3.1 锁所在的事务信息

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

3.2 索引信息

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

3.3 表锁/行锁信息

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

3.4 type_mode

MySQL 锁的内存结构,mysql,数据库

锁的模式(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,即一个比特位映射到业内的一条记录。文章来源地址https://www.toymoban.com/news/detail-834408.html

到了这里,关于MySQL 锁的内存结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mysql不同数据库之间表结构同步

    开发环境的Mysql表结构做了修改,要同步到其他环境数据库中使用数据库管理工具JookDB的表结构同步功能就很方便。虽然Navicat也有这个功能但是有免费的当然是用免费的。 用JookDB添加数据库后在数据库节点上右键选择“同步结构”即可开始表结构同步。 1.选择结构同步的源库

    2024年02月05日
    浏览(39)
  • 【数据库——MySQL(实战项目1)】(1)图书借阅系统——数据库结构设计

    经过前期的学习,我们已经掌握数据库基础操作,因此是时候来做一个实战项目了—— 图书借阅系统 。对于图书借阅系统,相信大家不难想到至少需要 3 张表,分别是: 借阅人表 , 图书表 和 借阅信息表 (当然不限于这些表,大家可以根据自己的想法创建其它表)。 那么

    2024年02月03日
    浏览(53)
  • MySQL数据库精选(从入门使用到底层结构)

    DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段) DML: 数据操作语言,用来对数据库表中的数据进行增删改 DQL: 数据查询语言,用来查询数据库中表的记录 DCL: 数据控制语言,用来创建数据库用户、控制数据库的控制权限 数据定义语言 数据库操作 查询所有数据

    2024年02月19日
    浏览(38)
  • MySql数据库的初步安装与数据表结构数据管理

    目录 一、数据库的相关了解 1)数据库的概念  数据(Data) 表 数据库系统 2)数据库系统发展史 第一代数据库 第二代数据库 第三代数据库 当今主流数据库介绍 2)数据库的分类  关系数据库 非关系型数据库 非关系型数据库的优点 二、mysql的yum安装与源码编译安装   1)源

    2024年02月08日
    浏览(100)
  • 【MySQL数据库 | 第十七篇】索引以及索引结构介绍

    目录 前言: 索引简介:  索引结构:           二叉树索引结构         Tree(普通二叉树)         B-Tree(多路平衡查找树)         B+Tree          哈希索引数据结构 总结: 在实际生活中,我们对SQL语句进行优化实际上有很大一部分都是对索引进行优化,因此对索引

    2024年02月09日
    浏览(55)
  • java八股文面试[数据库]——MySQL索引的数据结构

    知识点: 【2023年面试】mysql索引的基本原理_哔哩哔哩_bilibili 【2023年面试】mysql索引结构有哪些,各自的优劣是什么_哔哩哔哩_bilibili

    2024年02月10日
    浏览(32)
  • mysql从入门到放弃之数据库体系结构与管理

    第一篇文章中主要学习了mysql二进制的基本安装及数据库初始化等操作,本篇文章主要了解mysql的体系结构和管理,例如: mysql的实例组成、逻辑存储结构、物理存储结构等方面展开学习 提示:以下是本篇文章正文内容,下面案例可供参考 3.1、mysqld守护进程结构 3.2、 引入sql语句

    2024年01月21日
    浏览(33)
  • MySQL数据库---库基本操作 以及 表结构的操作(DDL)

    目录 前言 一.数据库的操作 1.1显示当前数据库 1.2创建数据库 1.3使用数据库  1.4删除数据库  二.数据类型 2.1数值类型 2.2字符串类型 2.3日期类型 三.数据表的操作  3.1 创建表结构。  3.2查看数据库中拥有的数据表  3.3查看指定的表结构   3.4修改表结构   3.5删除表结构  

    2024年02月09日
    浏览(52)
  • MySQL高级第十一篇:数据库调优策略(定位-调优-结构)

    1.尽可能节省系统资源,以便系统可以提供更大负荷的服务。 (吞吐量更大) 2.合理的结构设计和参数调整,以提高用户操作响应的速度。 (响应速度更快) 3.减少系统的瓶颈,提高MySQL数据库整体的性能。 用户是我们的服务对象,因此他们的反馈是最直接的。虽然他们不会

    2023年04月10日
    浏览(40)
  • MySQL的数据结构:数据库(Database)、表(Table)、记录(Record)和字段(Field)

    MySQL的数据结构可以看作是一个层次化的组织方式,从最高的层次到最低的层次分别是:数据库(Database)、表(Table)、记录(Record,也就是数据行)和字段(Field,也就是数据列)。 数据库(Database) : 数据库是最高层次的存储结构,它可以包含多个表、视图、存储过程、

    2024年02月21日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包