Mysql8和Mysql5加锁规则的细微不同

前言

验证版本 分别为Mysql5.7.22和Mysql8.0.26

关于Mysql5.7.22的加锁规则请查看  MySQL行锁加锁规则之等值查询 和 MySQL行锁加锁规则之范围查询

两个版本的等值查询规则一样,区别在于范围查询的“向右匹配到第一个不符合记录” 的加锁规则,Mysql5.7.22加的是临键锁,而Mysql8.0.26加的是间隙锁。下面对比两个版本范围查询的加锁规则,忽略索引失效场景。

对比

  • mysql8可通过select * from performance_schema.data_locks 或者SHOW ENGINE INNODB STATUS查看加锁信息
  • mysql5需要通过SHOW ENGINE INNODB STATUS查看加锁信息

-- 开启锁的监控
SET GLOBAL innodb_status_output=ON;
SET GLOBAL innodb_status_output_locks=ON;

CREATE TABLE `ct` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`abc` int(10) unsigned NOT NULL,`abc_uk` int(10) unsigned NOT NULL,`remark` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `uk_abc_uk` (`abc_uk`) USING BTREE,KEY `idx_abc` (`abc`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
INSERT INTO `ct`
(`id`, `name`, `abc`, `abc_uk`, `remark`) 
VALUES 
(10, '巴西', 10, 10, NULL),
(20, '阿根廷', 20, 20, NULL),
(30, '葡萄牙', 30, 30, NULL),
(40, '法国', 40, 40, NULL);
索引sql语句Mysql 5.7.22加锁范围Mysql 8.0.26加锁范围
主键BEGIN;
SELECT * FROM ct WHERE id<10 FOR UPDATE
临键锁(0,10]间隙锁(0,10)
BEGIN;
SELECT * FROM ct WHERE id<=10 FOR UPDATE
临键锁(0,10]和10,20]临键锁(0,10]
BEGIN;
SELECT * FROM ct WHERE id>40 FOR UPDATE
临键锁(40,supremum ]临键锁(40,supremum ]
BEGIN;
SELECT * FROM ct WHERE id>=40 FOR UPDATE
临键锁(40,supremum ] 和id=40记录锁临键锁(40,supremum ] 和id=40记录锁
唯一索引begin;
SELECT *from ct where abc_uk <10  for UPDATE;
临键锁(0,10]临键锁(0,10]
begin;
SELECT *from ct where abc_uk <=10  for UPDATE;
临键锁(0,10]和10,20];主键id=10记录锁临键锁(0,10]和10,20];主键id=10记录锁
BEGIN;
SELECT * FROM ct WHERE abc_uk >40 FOR UPDATE
临键锁(40,supremum ]临键锁(40,supremum ]
BEGIN;
SELECT * FROM ct WHERE abc_uk >=40 FOR UPDATE
临键锁(20,40]和40,supremum ];主键id=40记录锁临键锁(20,40]和40,supremum ];主键id=40记录锁
普通索引BEGIN;
SELECT * FROM ct WHERE abc<10 FOR UPDATE
临键锁(0,10]临键锁(0,10]
BEGIN;
SELECT * FROM ct WHERE abc<=10 FOR UPDATE
临键锁(0,10]和10,20];主键id=10记录锁临键锁(0,10]和10,20];主键id=10记录锁
BEGIN;
SELECT * FROM ct WHERE abc >40 FOR UPDATE
临键锁(40,supremum ]临键锁(40,supremum ]
BEGIN;
SELECT * FROM ct WHERE abc>=40 FOR UPDATE
临键锁(20,40]和40,supremum ];主键id=40记录锁临键锁(20,40]和40,supremum ];主键id=40记录锁

总结

范围查询,两者唯一索引和普通所以的规则还是一样的,区别在主键索引,对于<查询Mysql 5匹配的是临键锁,Mysql 8匹配的间隙锁;对于<=查询,Mysql 5会匹配到第一个不符合的记录加临键锁,而Mysql 8不会匹配到第一个不符合的记录。

扩展

关于“向右匹配到第一个不符合记录”的理解,下面从同一个sql正序与降序加锁范围不同分析。

sql加锁范围
BEGIN;
SELECT *FROM ct WHERE abc>10 AND abc<40  FOR UPDATE;

主键记录锁id=20和id=30

临键锁(10,20]和(20,30],(30,40]

BEGIN;
SELECT *FROM ct WHERE abc>10 AND abc<40 ORDER BY abc DESC FOR UPDATE;

主键记录锁id=20和id=30

临键锁(最小值,10]和10,20](20,30]

间隙锁(30,40)

降序和正序相比,多了临键锁(最小值,10] ,临键锁30,40]变成了间隙锁(30,40)。这里涉及的就是向右匹配到第一个不符合记录”的规则,这个向右不是很好理解,我们把它按索引的检索顺序理解,即按索引顺序遍历到最后第一个不符合条件的记录。上面sql正序,从小到大遍历,第一个符合的记录是20,故遍历到第一个不符合的记录40加临键锁30,40];降序:是从大到小遍历,第一个符合记录的是30,故遍历到第一个不符合的记录10加临键锁(最小值,10]。

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

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

相关文章

2024全新返佣商城分销商城理财商城系统源码 全开源PHP+VUE源码

2023全新返佣商城分销商城理财商城系统源码 全开源PHPVUE源码 程序安装环境要求&#xff1a; nginx1.16 php7.2 mysql5.6 程序全开源PHPVUE源码 有需要测试的老铁&#xff0c;拿去测试吧

Linux_基础指令(一)

目录 1、ls指令 1.1 ls -l 1.2 ls -a 1.3 ls -i 2、pwd指令 3、cd指令 3.1 路径的概念 3.1.1 绝对路径 3.1.2 相对路径 3.2 cd ~ 3.3 cd - 4、touch指令 5、mkdir指令 6、删除系列的指指令 6.1 rmdir 6.2 rm 7、man指令 8、cp指令 9、move指令 结…

【Java】十大排序

目录 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的序列&#xff0c;依次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历…

论文阅读_参数微调_P-tuning_v2

1 P-Tuning PLAINTEXT 1 2 3 4 5 6 7英文名称: GPT Understands, Too 中文名称: GPT也懂 链接: https://arxiv.org/abs/2103.10385 作者: Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, Jie Tang 机构: 清华大学, 麻省理工学院 日期: 2021-03-18…

cache的58问,您能回答上几个

快速链接: . &#x1f449;&#x1f449;&#x1f449; 个人博客笔记导读目录(全部) &#x1f448;&#x1f448;&#x1f448; 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448;联系方式-加入交流群 ---…

东京旅行攻略:机票、交通、消费和看富士山

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 分享一些最近从香港去日本东京的短期周末旅行体验。 1&#xff1a;香港飞东京需要4小时&#xff0c;非旺季往返的价格在2000元左右。去年五一假期&#xff0c;我提前了两个多月买的香港快运就是这个价&#xff0c;不算贵。…

微信小程序的页面制作---常用组件及其属性

微信小程序里的组件就是html里的标签&#xff0c;但其组件都自带UI风格和特定的功能效果 一、常用组件 view&#xff08;视图容器&#xff09;、text&#xff08;文本&#xff09;、button&#xff08;按钮&#xff09;、image&#xff08;图片&#xff09;、form&#xff08…

Sentinel篇:线程隔离和熔断降级

书接上回&#xff1a;微服务&#xff1a;Sentinel篇 3. 隔离和降级 限流是一种预防措施&#xff0c;虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围&#xff0c;避免雪崩&#xff0c;就要靠线程隔离…

【Visual Studio】VS转换文件为UTF8格式

使用高级保存选项 更改VS的编码方案 首先需要打开高级保存选项 然后打开 文件 —> 高级保存选项 即可进行设置

OSPF协议全面学习笔记

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 OSPF协议全面学习笔记 1、OSPF基础2、DR与BDR3、OSPF多区域4、虚链路Vlink5、OSPF报文6、LSA结构1、一类/二类LSA&#xff08;Router-LSA/Network-LSA&#xff09; 更新完善中... 1、…

ChatGPT :确定性AI源自于确定性数据

ChatGPT 幻觉 大模型实际应用落地过程中&#xff0c;会遇到幻觉&#xff08;Hallucination&#xff09;问题。对于语言模型而言&#xff0c;当生成的文本语法正确流畅&#xff0c;但不遵循原文&#xff08;Faithfulness&#xff09;&#xff0c;或不符合事实&#xff08;Factua…

解决被反射的类无法被spring管理,空指针异常问题

目录 问题 原因 解决方案 问题 这是我在开发语音指令识别功能时遇到的问题&#xff0c;在将语音转成文字后需要进行指令匹配&#xff0c;指令匹配成功&#xff0c;就会获得对应的处理方法名称以及所属类&#xff0c;然后通过反射机制去执行该方法完成指令对应的操作 部分代…

C++——string

一学习string的原因 1.从个人理解角度上&#xff1a; 在刚开始学习之前&#xff0c;我只知道学习完string在以后的刷题中能提高做题效率&#xff0c;在对字符串的处理string库中也许有对应的接口去实现需求&#xff0c;不用自己去写函数的实现。 但在学string中改变了之前的…

谈谈IC、ASIC、SoC、MPU、MCU、CPU、GPU、DSP、FPGA、CPLD的简介

谈谈IC、ASIC、SoC、MPU、MCU、CPU、GPU、DSP、FPGA、CPLD的简介 IC (Integrated Circuit) 集成电路 (Integrated Circuit, IC) 是一种把电路中的元器件如电阻、电容、晶体管等集成在一块半导体材料上的微型电子器件。它是现代电子系统的基础组件&#xff0c;按照功能可分为模…

【PyTorch】基础学习:一文详细介绍 torch.save() 的用法和应用

【PyTorch】基础学习&#xff1a;一文详细介绍 torch.save() 的用法和应用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f44…

Flask中的Blueprints:模块化和组织大型Web应用【第142篇—Web应用】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask中的Blueprints&#xff1a;模块化和组织大型Web应用 在构建大型Web应用时&#xff0…

最后的挣扎 - Qt For Android on HuaWei Mate 60Pro (v4.0.0)

简介 为什么叫最后的挣扎, 其实都知道即将到来的 HarmonyOS NEXT 将抛弃Android支持&#xff0c;纯血HarmonyOS 将上线&#xff0c; 此时再说Qt for android支持Huawei HarmonyOS的设备其实并没有多少意思&#xff0c; 但恐怕在大多数基础软件完成兼容前&#xff0c; 很多人还是…

Linux系统中的网络协议和协议栈

在当今数字化世界中&#xff0c;网络已经成为了连接人与人、人与机器、机器与机器的重要桥梁。Linux操作系统在网络领域扮演着重要角色&#xff0c;其网络协议和协议栈是支撑其网络功能的基础。本文将深入探讨Linux系统中的网络协议和协议栈&#xff0c;包括其组成、功能以及如…

k8s的master节点主要模块说明

背景 k8s是一个master-worker模式的集群&#xff0c;master节点的作用主要是用于管理&#xff0c;worker节点的作用是用于运行docker 容器&#xff0c;master节点中有三个重要的模块组件&#xff0c;本文就来简单看下master的这三个模块组件的功能 master节点主要模块 1 API…

机器视觉学习(五)—— 图像的几何

一、图像的几何变化 图像的几何变化指的是通过改变图像的位置、尺寸和方向等参数来实现的图像变换。常见的图像几何变化包括平移、旋转、缩放和翻转等。 平移&#xff1a;将图像在平面上按照指定的平移距离水平或垂直移动。 旋转&#xff1a;按照指定的角度将图像绕中心或其他…