MySQL InnoDB supremum pseudo-record范围说明

news2024/9/20 2:25:51

引言

在 MySQL InnoDB 存储引擎中,锁机制是保证数据一致性和事务隔离的重要手段之一。InnoDB 引入了多种锁机制,其中 next-key lock 是实现行锁和间隙锁的关键部分。在 next-key lock 的机制中,supremum pseudo-record 是一个特殊的存在,通常被描述为 “正无穷大” ,用于表述索引记录中最大值之后的间隙。然而,在实际应用中,supremum pseudo-record 的行为并非总是符合这一描述。
本文通过一系列测试案例,深入探讨 supremum pseudo-record 的实际范围和锁定机制,以期帮助开发者更好地理解 InnoDB 的锁行为。

官方介绍:

For the last interval, the next-key lock locks the gap above the largest value in the index and the “supremum” pseudo-record having a value higher than any value actually in the index. 
The supremum is not a real index record, so, in effect, this next-key lock locks only the gap following the largest index value.
来源: https://dev.mysql.com/doc/refman/8.4/en/innodb-locking.html

案例分析

表数据说明

CREATE TABLE `t_10` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `a` INT(11) DEFAULT NULL,
  `b` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `a` (`a`),
  KEY `b` (`b`)
) ENGINE=INNODB;

-- 按序插入10w条数据
DELIMITER ;;
CREATE PROCEDURE idata_10()
BEGIN
  DECLARE i INT;
  SET i=1;
    start transaction;
  WHILE(i<=100000)DO
    INSERT INTO t_10 VALUES(i, i, i);
    SET i=i+1;
  END WHILE;
    commit;
END;;
DELIMITER ;
CALL idata_10();

默认隔离级别(RR)

案例一:supremum pseudo-record 的加锁范围分析

-- session A
START TRANSACTION;
SELECT  id FROM t_10 WHERE a = 1680 LOCK IN SHARE MODE;

加锁信息如下图,(1679、1680]、(1680、1681),这个符合预期;为什么会有supremum pseduo-record,这个不符合预期;
在这里插入图片描述

此时再开启一个会话,执行如下sql:

-- session B
START TRANSACTION;
SELECT  id FROM t_10 WHERE a = 1682 FOR UPDATE;

会话B加锁范围符合预期;也能说明session A加锁范围supremum pseduo-record,表示的不是(1681, +∞)
在这里插入图片描述

案例二:更大范围内的锁定分析

session A:
START TRANSACTION;
SELECT  id FROM t_10 WHERE a > 1 AND a < 1000000 FOR UPDATE;

supremum pseudo-record,出现了91次,和预期不符;
在这里插入图片描述

案例三:索引页大小占用分析

mysql innodb一个页是16K(默认大小),对于索引a,叶子节点,一个页能存储约1100条记录,而我本地实际验证情况和这个匹配。
a的范围每增加约1100时,会多锁定一个supremum pseudo-record的间隙。
这一结果进一步表明,supremum pseudo-record 的锁定范围可能受到索引页内部结构的限制,而并非单纯地锁定“最大值之后的间隙”。
在这里插入图片描述

结论

基于上面的验证情况,得到的结论:supremum pseudo-record 的锁定范围不仅仅是文档中描述的“最大值之后的间隙”,也用于表示索引页内最后一个索引记录之后间隙的特殊伪记录。
表示最大值之后的间隙,通过select … where col >= max col value for update即可验证。

如有错误之处,恳请指正,感谢!

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

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

相关文章

排序算法【归并排序】

一、归并排序算法的原理 如下面数组所示进行归并排序。 对左半部分进行排序操作。 对左半部分进行归并操作。 二、归并排序 #include <stdio.h> #include "test.h"/* 归并排序法* arr:数组的首地址指针* begin:需要排序数组的起始序号* len:数组的长度*/ void…

微信小程序保存图片到相册

申请权限 代码如下 wx.downloadFile({url: image, //仅为示例&#xff0c;并非真实的资源success(res) {// 只要服务器有响应数据&#xff0c;就会把响应内容写入文件并进入 success 回调&#xff0c;业务需要自行判断是否下载到了想要的内容if (res.statusCode 200) {consol…

SpringBoot-04--整合登录注册动态验证码

文章目录 效果展示1.导入maven坐标2.编写代码生成一个验证码图片3.前端如何拿到验证码4. 后端生成验证码5前端代码 效果展示 效果&#xff0c;每次进入页面展现出来不同的验证码。 技术 使用别人已经写好的验证码生成器&#xff0c;生成图片&#xff0c;转为Base64编码&#x…

IndexError: list index out of range | 列表索引超出范围完美解决方法

IndexError: list index out of range &#x1f4c9; | 列表索引超出范围完美解决方法 IndexError: list index out of range &#x1f4c9; | 列表索引超出范围完美解决方法摘要 &#x1f4c4;引言 &#x1f680; 什么是 IndexError: list index out of range&#xff1f;&…

论文翻译:Jailbroken: How Does LLM Safety Training Fail?

越狱&#xff1a;LLM安全训练为何失败&#xff1f; 文章目录 越狱&#xff1a;LLM安全训练为何失败&#xff1f;摘要1 引言1.1 相关工作 2 背景&#xff1a;安全训练的语言模型和越狱攻击2.1 对受限行为的越狱攻击2.2 评估安全训练的语言模型 3 失败模式&#xff1a;目标冲突和…

自然语言处理工程师的薪资待遇高吗?工作职责是什么呢?

自然语言处理&#xff0c;通常称为NLP&#xff0c;是计算机科学、人工智能和语言学的交叉领域&#xff0c;侧重于使计算机理解、解释并生成人类语言。在分析海量文本数据和开发可处理文本数据系统方面&#xff0c;NLP工程师发挥着至关重要的作用&#xff0c;这些数据可用于搜索…

Fast API + LangServe快速搭建 LLM 后台

如果快速搭建一个 LLM 后台 API&#xff0c;使前端可以快速接入 LLM API。LangChain 或者 LlamaIndex 架构都可以快速集成各种大语言模型&#xff0c;本文将讲述如何通过 Fast API LangServe 快速的搭建一个后台 Rest API 服务。LLM 这些框架现在主打一个就是快速&#xff0c;…

网络状态码都是怎么回事,怎么监测状态码

一、状态码概览 HTTP状态码&#xff0c;作为HTTP协议中不可或缺的一部分&#xff0c;是服务器对客户端请求处理结果的直观反馈。它们由三位数字构成&#xff0c;蕴含着丰富的信息&#xff1a;首位数字定义了响应的大类&#xff0c;后两位则进一步细化了具体状态或错误类型。主…

13 Listbox 组件

13 Listbox 组件 Tkinter 的 Listbox 组件是一个用于显示列表项的控件&#xff0c;用户可以从中选择一个或多个项目。以下是对 Listbox 组件的详细说明和一个使用案例。 Listbox 组件属性 基本属性 width: 控件的宽度&#xff0c;通常以字符数为单位。height: 控件的高度&a…

【C++】String常见函数用法

一、string类对象的常见构造 我们可采取以下的方式进行构造&#xff0c;以下是常用的接口&#xff1a; //生成空字符串 string; //拷贝构造函数 string(const string& str); //用C-string来构造string类对象 string(const char* s); //string类对象中包含n个字符c strin…

C++ 之网络编程基础复习总结

基础 IP 地址可以在网络环境中唯一标识一台主机。 端口号可以在主机中唯一标识一个进程。 所以在网络环境中唯一标识一个进程可以使用 IP 地址与端口号 Port 。 字节序 TCP/IP协议规定&#xff0c;网络数据流应采用大端字节序。 大端&#xff1a;低地址存高位&#xff0c…

FastCopy文件快速复制v5.7.15

软件介绍 FastCopy文件快速复制工具。Windows平台上最快的文件复制、删除软件&#xff01;功能强劲&#xff0c;性能优越&#xff01;它是源于日本的高效文件复制加速软件&#xff0c;支持拖拽操作&#xff0c;三种不同HDD模式&#xff1b;支持通配符&#xff0c;任务管理/命令…

XSS项目实战

目录 一、项目来源 二、实战操作 EASY 1 2 3 4 5 6 7 8 一、项目来源 XSS Game - Learning XSS Made Simple! | Created by PwnFunction 二、实战操作 EASY 1 1.Easy -1 2.题目要求及源码 Difficulty is Easy.Pop an alert(1337) on sandbox.pwnfunction.com.No …

基于STM32开发的智能植物浇水系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化土壤湿度检测与浇水控制显示与状态指示Wi-Fi通信与远程监控应用场景 家庭植物自动浇水农业智能灌溉系统常见问题及解决方案 常见问题解决方案结论 1. 引言 智能植物浇水系统通过集…

学习记录第二十九天

信号量————来描述可使用资源的个数 信号量&#xff08;Semaphore&#xff09;是一种用于控制多个进程或线程对共享资源访问的同步机制。在C语言中&#xff0c;通常我们会使用POSIX线程&#xff08;pthread&#xff09;库来实现信号量的操作 信号量有两个主要操作&#xf…

【学习总结】JVM篇

JVM JVM基础知识 主力机型 HotSpot VM HotSpot虚拟机时OpenJDK和OracleJDK中默认的Java虚拟机。它最初并非由Sun公司所开发&#xff0c;而是由一家名为“Longview Technologies”的小公司设计。Sun公司注意到这款虚拟机在即时编译等多个方面有着优秀的理念和实际成果&#…

【Redis】字符串数据类型深入解析与应用实践

目录 String 字符串常⻅命令计数命令其他命令命令⼩结内部编码典型使⽤场景 String 字符串 字符串类型是 Redis 最基础的数据类型&#xff0c;关于字符串需要特别注意&#xff1a;1&#xff09;⾸先 Redis 中所有的键的类型都是字符串类型&#xff0c;⽽且其他⼏种数据结构也都…

牙科就诊管理系统--论文pf

TOC springboot399牙科就诊管理系统--论文pf 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

企业考勤管理神器:9款精选软件推荐

本文将介绍9款考勤管理软件&#xff1a;Moka、超人HR、慧点、云易通、麦勤通、TeKard考勤管理系统、Toggl Track、ZoomShift、Kronos Workforce Ready。 选择合适的考勤管理软件对企业来说可不是件小事。面对市场上琳琅满目的工具&#xff0c;选错了不仅浪费时间和金钱&#xf…

【二分查找】--- 初阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Joureny 上篇我们讲解了关于二分的朴素模板和边界模板&#xff0c;本篇博客我们试着运用这些模板。 &#x1f3e0; 搜索插入位置 &#x1f4cc; 题目…