Mysql高级——锁(2)

news2024/11/17 20:44:03

4. 锁的内存结构

InnoDB 存储引擎中的锁结构如下:

在这里插入图片描述

  1. 锁所在的事务信息:

不论是表锁还是行锁,都是在事务执行过程中生成的,哪个事务生成了这个锁结构,这里就记录这个事务的信息。

此锁所在的事务信息在内存结构中只是一个指针,通过指针可以找到内存中关于该事务的更多信息,比方说事务id等。

  1. 索引信息:

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

  1. 表锁/行锁信息

表锁结构和行锁结构在这个位置的内容是不同的:

表锁:

记载着是对哪个表加的锁,还有其他的一些信息。

行锁:

记载了三个重要的信息:

  • Space ID :记录所在表空间。

  • Page Number :记录所在页号。

  • n_bits :对于行锁来说,一条记录就对应着一个比特位,一个页面中包含很多记录,用不同的比特位来区分到底是哪一条记录加了锁。为此在行锁结构的末尾放置了一堆比特位,这个n_bits 属性代表使用了多少比特位。

n_bits的值一般都比页面中记录条数多一些。主要是为了之后在页面中插入了新记录后也不至于重新分配锁结构

  1. type_mode :

这是一个32位的数,被分成了lock_mode 、lock_type 和rec_lock_type 三个部分,如图所示:

在这里插入图片描述

  • 锁的模式( lock_mode ),占用低4位,可选的值如下:
    • 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 (十进制的0 ):表示next-key锁。
    • LOCK_GAP (十进制的512 ):也就是当第10个比特位置为1时,表示gap锁。
    • LOCK_REC_NOT_GAP (十进制的1024 ):也就是当第11个比特位置为1时,表示正经记录锁。
    • LOCK_INSERT_INTENTION (十进制的2048 ):也就是当第12个比特位置为1时,表示插入意向锁。其他的类型:还有一些不常用的类型我们就不多说了。
  • is_waiting 属性呢?基于内存空间的节省,所以把is_waiting 属性放到了type_mode 这个32位的数字中:

    • LOCK_WAIT (十进制的256 ) :当第9个比特位置为1 时,表示is_waiting 为true ,也就是当前事务尚未获取到锁,处在等待状态;当这个比特位为0 时,表示is_waiting 为false ,也就是当前事务获取锁成功。
  1. 其他信息:

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

  1. 一堆比特位:

如果是行锁结构的话,在该结构末尾还放置了一堆比特位,比特位的数量是由上边提到的n_bits 属性表示的。InnoDB数据页中的每条记录在记录头信息中都包含一个heap_no 属性,伪记录Infimum heap_no 值为0 , Supremum heap_no 值为1 ,之后每插入一条记录, heap_no 值就增1。锁结构最后的一堆比特位就对应着一个页面中的记录,一个比特位映射一个heap_no ,即一个比特位映射到页内的一条记录。

5. 锁监控

关于MySQL锁的监控,我们一般可以通过检查InnoDB_row_lock 等状态变量来分析系统上的行锁的争夺情况

mysql> show status like 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
+-------------------------------+-------+
5 rows in set (0.01 sec)

对各个状态量的说明如下:

  • Innodb_row_lock_current_waits:当前正在等待锁定的数量;
  • Innodb_row_lock_time :从系统启动到现在锁定总时间长度;(等待总时长)
  • Innodb_row_lock_time_avg :每次等待所花平均时间;(等待平均时长)
  • Innodb_row_lock_time_max:从系统启动到现在等待最常的一次所花的时间;
  • Innodb_row_lock_waits :系统启动后到现在总共等待的次数;(等待总次数)

其他监控方法:

MySQL把事务和锁的信息记录在了information_schema 库中,涉及到的三张表分别是INNODB_TRX INNODB_LOCKS INNODB_LOCK_WAITS

MySQL5.7及之前,可以通过information_schema.INNODB_LOCKS查看事务的锁情况,但只能看到阻塞事务的锁;如果事务并未被阻塞,则在该表中看不到该事务的锁情况。

MySQL8.0删除了information_schema.INNODB_LOCKS,添加了performance_schema.data_locks ,可以通过performance_schema.data_locks查看事务的锁情况,和MySQL5.7及之前不同,performance_schema.data_locks不但可以看到阻塞该事务的锁,还可以看到该事务所持有的锁。

同时,information_schema.INNODB_LOCK_WAITS也被performance_schema.data_lock_waits 所代替。

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

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

相关文章

让世界更精彩,拓世科技新品亮相世界舞台!虚实融合 智兴百业,2023世界VR产业大会正式开幕!

在这个科技重塑未来的时代,每一分、每一秒,科学技术都在飞速发展,成为我们都在经历的现实。世界VR产业大会,让我们再次目睹了科技带来的奇迹。VR、5G、人工智能、元宇宙等新技术,作为社会进步的引擎,正塑造…

Python程序龟速过载怎么办,asyncio并发教程来解决

前言 许多应用程序,尤其在当今的Web应用程序领域,严重依赖I/O操作。这些类型的操作包括从Internet下载网页的内容、通过网络与一组微服务进行通信,或者针对MySQL或Postgres等数据库同时运行多个查询。Web请求或与微服务的通信可能需要数百毫…

【数据结构】——二叉树的基础知识

数概念及结构 数的分类 二叉树、多叉树 数的概念 树是一种非线性的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做树的原因是它看起来像一颗倒挂的树,也就是说它是跟朝上,而叶朝下的。 有一个特殊的节点&…

小红书达人怎么对接,博主沟通流程汇总!

想要在小红书平台进行宣推,就离不开博主的帮助。一般来说,与小红书博主沟通,分为意向沟通、下单沟通、内容沟通和数据沟通方面。今天为大家分享下小红书达人怎么对接,博主沟通流程汇总! 一、意向沟通 意向沟通是小红书…

MyBatis中怎样查看执行的sql语句日志?

MyBatis中怎样查看执行的sql语句日志? 在mybatis中我们执行sql语句是通过动态代理接口执行的,我们并不能看到内部的sql的执行情况,所以你执行完一个接口之后,你也不知道sql到底有没有执行?以及sql执行的对不对&#x…

【试题016】逗号表达式例题

1.题目&#xff1a;设int a,b;,则表达式(b2,a5,b,ab)的值是 &#xff1f; 2.代码分析&#xff1a; #include <stdio.h> int main() {//设int a,b;,则表达式(b2,a5,b,ab)的值是 ()int a, b;printf("%d\n", (b 2, a 5, b, a b));//分析&#xff1a;逗号表达…

基于Java+Springboot+Vue前后端分离的商品进销存管管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 当今社会&#xff0c;…

dubbogo-02 将服务注册到nacos

增加dubbo配置 dubbo:application:name: gotestmodule: gotestgroup: daoorganization: qiudaozhangowner: qiudaozhangversion: 0.1environment: proregistries:nacosWithCustomGroup:protocol: nacos # 注册中心选择 nacosaddress: 127.0.0.1:8848 # nacos ipgroup: RIDE # …

3、Kafka Broker

4.1 Kafka Broker 工作流程 4.1.1 Zookeeper 存储的 Kafka 信息 &#xff08;1&#xff09;启动 Zookeeper 客户端。 [hadoop102 zookeeper-3.5.7]$ bin/zkCli.sh&#xff08;2&#xff09;通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2] ls /kaf…

最爱问的高频ConcurrentHashMap原理,你会了吗?

1、ConcurrentHashMap 是什么&#xff1f;它的工作原理是什么&#xff1f; ConcurrentHashMap 是Java中的一个线程安全的散列表实现。与HashMap不同&#xff0c;ConcurrentHashMap支持多个线程同时访问和修改散列表&#xff0c;而不需要任何额外的同步机制。 ConcurrentHashM…

C++ vector类模拟实现

目录 一、成员变量 二、构造函数 1.默认构造 2.拷贝构造 3.迭代器构造 4.使用n个值构造 5.赋值拷贝 三、析构函数 四、vector重要成员函数 1.size和capacity函数 2.reserve函数 3.resize函数 4.push_back函数 5.insert函数 6.erase函数 7.重载operator[] 一、成…

html 按钮点击倒计时,限制不可点击

html 按钮点击倒计时&#xff0c;限制不可点击 e94cbabd25cfc7f3f53a50a235734c22.jpg <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title></title></head&…

Ubuntu20.4 设置代理

主要是涉及2个代理 涉及apt 可以在、/etc/apt/apt.conf 中进行修改 在系统全局可以在/etc/profile中进行修改

2023年最新全国各省行政区划数据(省-市-区县-乡镇-村)

背景 现实情况&#xff0c;在信息系统开发、电子商务平台、app等等相关软件开发&#xff0c;都会设计到行政区数据联动&#xff0c;这里已经爬好全国各省行政区划数据可供下载。 数据来源 内容为2023年全国统计用区划代码&#xff08;12位&#xff09;和城乡分类代码&#xff…

跨境电商:产业带的深度赋能

近年来&#xff0c;中国跨境电商平台崭露头角&#xff0c;成为推动国内产业带转型升级和出海的新引擎。这一充满活力的领域不仅让中国制造走向世界&#xff0c;也为国内众多产业提供了数字化升级的机会&#xff0c;实现了“小单快反”和按需供应。 专业跨境电商平台如SHEIN和阿…

RabbitMQ整理

MQ(Message Queue)&#xff1a;是队列&#xff0c;也是跨进程的通信机制&#xff0c;用于上下游传递信息 FIFO(First In First Out)&#xff1a;先进先出 RabbitMQ访问&#xff1a;http://127.0.0.1:15672/ 默认账号密码&#xff1a;guest 优势&#xff1a;流量削峰&#x…

计网----使用代码实现C/S模型的数据通信,IP地址分类,子网掩码,网关,广播地址,非默认子网掩码,子网划分的常见问题

计网----使用代码实现C/S模型的数据通信,IP地址分类,子网掩码,网关,广播地址,非默认子网掩码,子网划分的常见问题 一.使用代码实现C/S模型的数据通信&#xff08;七层网络系统的博客https://blog.csdn.net/m0_73483024/article/details/133916201?spm1001.2014.3001.5502的后…

completablefuture的使用

CompletableFuture使用详解 【Java异常】Variable used in lambda expression should be final or effectively final CompletableFuture原理与实践-外卖商家端API的异步化 项目描述 项目接口需要从下游多个接口获取数据&#xff0c;并且下游的网络不稳定还会涉及到循环调用…

DC电源模块的模拟电源对比数字电源的优势有哪些?

BOSHIDA DC电源模块的模拟电源对比数字电源的优势有哪些&#xff1f; DC电源模块是一种电子元件&#xff0c;用于将交流电转换为直流电&#xff0c;以供电路板、集成电路等电子设备使用。在直流电源模块中&#xff0c;有模拟电源和数字电源两种类型。 模拟电源是一种传统的电源…