mysql间隙锁demo分析

概述

通常用的mysql都是innodb引擎;
一般在update的时候用id都会认为是给行记录加锁;

在使用非唯一索引更新时,会遇到临键锁(范围锁);
临键锁和表中的数据有关;

mysq版本:8
隔离级别RR可重复读

mysql的lockMode

查看锁的活动信息

-- 当前活动的锁信息
SELECT * FROM performance_schema.data_locks;
  • X,REC_NOT_GAPX代表排他锁REC_NOT_GAP代表行锁。综合起来就是对这条数据(索引项)添加了行级排他锁;
  • IX:意向排它锁。上述案例中,给表添加了一个意向排它锁。当其他事务要对全表的数据进行加锁时,那么就不需要判断每一条数据是否被加锁了。
  • X,GAP:X代表排他锁;GAP代表间隙锁(前开后开,即当前的lock_data中的索引值对应的id最近的上一个id值之间的空隙被锁定了)
  • supremum pseudo-record: 是 InnoDB 中定义的一种特殊记录,我们可以理解为 +∞

X,GAPdemo说明

假设表中的数据如下,age有普通BTree索引,然后事务1更新其中age为24的数据;
可以看到age=24对应的id=3加上了X排它锁,id=3的加上了行级排它锁;然后对age=24后面的age索引加了一个排他间隙锁,锁住了id范围为(3,5)时间的间隙;

综上获得了id范围为[3,5)之间的锁

-- 事务1操作
UPDATE user SET name = 'Vladimir' WHERE age = 24;

在这里插入图片描述
在这里插入图片描述

临键锁

假设有如下表;且表中数据如下;

-- 表结构如下
CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',`name` varchar(255) DEFAULT NULL COMMENT '姓名',`age` int DEFAULT NULL COMMENT '年龄',PRIMARY KEY (`id`),KEY `idx_age` (`age`)
) ENGINE=InnoDB COMMENT='用户表';

捞点网图,间隙锁可以看做一个左开右闭的区间
在这里插入图片描述
那么在事务A执行sql;
select查询,查询到age=24的记录,然后继续向后查询,发现后一条是age=32,age不等于24,向后查询结束,所以在获取间隙锁(24,32],同时当前age=24的记录会加上排它锁;

然后再向前查询前一条记录是age=10,不等于24,向前查询结束,然后会获取(10,24]的间隙锁;

综上所述,INNDB加锁首先定位到等于或者第一个大于目标值的叶子节点

事务A

-- 根据非唯一索引列 UPDATE 某条记录
UPDATE user SET name = 'Vladimir' WHERE age = 24;
-- 或根据非唯一索引列 锁住某条记录
SELECT * FROM user WHERE age = 24 FOR UPDATE;

事务B中执行sql;会遇到间隙锁,会阻塞

INSERT INTO user VALUES(100, 'Ezreal', 30);

试验结果如下
在这里插入图片描述
在这里插入图片描述

-- 当前活动的锁信息
SELECT * FROM performance_schema.data_locks;

在这里插入图片描述

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

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

相关文章

SpringBoot整合mail进行发送邮箱

Spring Boot整合邮箱进行发送 1. 添加依赖 在pom.xml文件中添加spring-boot-starter-mail依赖&#xff0c;如下所示&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>…

2023年全国职业院校技能大赛网络系统管理 网络模块 出口配置

(四)出口网络配置 1.北京综合服务中心办公终端可通过出口路由器R2 G 0/0.21子接口的NAPT方式访问互联网。 ip route vrf BG 0.0.0.0 0.0.0.0 GigabitEthernet 0/0.21 21.1.1.1 ip access-list extended 100 10 permit ip 10.1.20.0 0.0.0.255 any 20 permit ip 10.2.20.0 0…

jmeter的常用功能及在测试中的基本使用和压测实战

Jmeter基础功能 了解Jmeter的常用组件 元件&#xff1a;多个类似功能组件的容器&#xff08;类似于类&#xff09; 一&#xff1a;Test Plan&#xff08;测试计划&#xff09; 测试计划通常用来给测试的项目重命名&#xff0c;使用多线程脚本运行时还可以配置线程组运行方式…

HCIA-Datacom题库(自己整理分类的)——STP协议判断

默认情况下&#xff0c;STP协议中根桥的根路径开销一定是0。√ 根桥交换机上所有的端口都是指定端口。 交换网络存在冗余链路时&#xff0c;使用STP可以解决交换网络中的环路问题。√ 当交换机有冗余链路时&#xff0c;使用STP可以解决问题。√ 交换机组成的网络不开启STP&…

向新字符设备驱动代码框架中添加Led功能函数

一. 简介 上一篇文章学习编写新字符设备驱动框架代码。文章地址如下&#xff1a; 新字符设备驱动框架代码搭建-CSDN博客 本文在以上这篇文章代码实现的基础上&#xff0c;加入涉及 Led灯的功能函数集实现。 代码实现要求&#xff1a;测试程序&#xff08;即应用程序&#…

【C++】STL 容器 - map 关联容器 ① ( std::map 容器简介 | std::map 容器排序规则 | std::map 容器底层实现 )

文章目录 一、std::map 容器1、std::map 容器简介2、std::map 容器排序规则3、std::map 容器底层实现 二、代码示例 - std::map 容器1、代码示例2、执行结果 一、std::map 容器 1、std::map 容器简介 std::map 容器 是 C 语言 标准模板库 ( STL , Standard Template Library ) …

分布式技术之数据复制技术

文章目录 什么是数据复制技术&#xff1f;数据复制技术原理及应用同步复制技术原理及应用异步复制技术原理及应用半同步复制技术原理及应用三种数据复制技术对比 什么是数据复制技术&#xff1f; 数据复制是一种实现数据备份的技术。数据复制技术&#xff0c;可以保证存储在不…

Plantuml之甘特图语法介绍(二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

基于SpringBoot的在线远程考试系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的在线远程考试系统,java…

磁盘和文件系统管理

一&#xff1a;磁盘结构&#xff1a; 1.磁盘基础&#xff1a; 扇区固定大小&#xff0c;每个扇区4k。磁盘会进行磨损&#xff0c;损失生命周期。 设备文件&#xff1a; 一切皆文件 设备文件&#xff1a;关联至一个设备驱动程序&#xff0c;进而能够跟与之对应硬件设备进行通…

UDP发送和接受数据

发送数据 public class sendmessage {public static void main (String[] args) throws IOException {DatagramSocket dsnew DatagramSocket();//打包数据开始String s"hello world";byte[] bs.getBytes();//获取InetAddress的对象InetAddress addressInetAddress.g…

什么是IDE?新手用哪个IDE比较

IDE代表集成开发环境&#xff08;Integrated Development Environment&#xff09;&#xff0c;它是一种软件应用程序&#xff0c;提供了一套工具&#xff0c;用于编写、调试和运行软件程序。一个IDE通常包含代码编辑器、编译器、调试器和其他各种工具&#xff0c;以便开发人员…

Rust学习笔记000 安装

安装命令 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh info: downloading installerWelcome to Rust!This will download and install the official compiler for the Rust programming la…

【基础】【Python网络爬虫】【3.chrome 开发者工具】(详细笔记)

Python网络爬虫基础 chrome 开发者工具元素面板&#xff08;Elements)控制台面板&#xff08;Console&#xff09;资源面板&#xff08;Source&#xff09;网络面板&#xff08;Network&#xff09;工具栏Requests Table详情 chrome 开发者工具 ​ 当我们爬取不同的网站是&…

MATLAB常用笔记记录(持续更新)

3.错误使用 reshape 元素数不能更改。请使用 [] 作为大小输入之一&#xff0c;以自动计算该维度的适当大小。 仔细检查之后发现原因是&#xff1a;两个栅格图层的行列数不一致。解决办法如下&#xff1a; 先改变栅格图层1源文件的投影坐标系&#xff0c;再进行掩膜提取&#x…

Linux环境安装2

1 redis单机版安装 1.1 安装 wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz tar -xzvf tcl8.6.1-src.tar.gz cd /usr/local/tcl8.6.1/unix/ ./configure make && make install使用redis-3.2.8.tar.gz&#xff08;截止2017年4月的最新稳定版&…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】点云配准

目录 几个相关概念 算法原理 什么是点云 点云的处理 ICP 算法 1 问题描述

常用CSS样式

目录 1、文本超出省略号代替 2、自定义滚动条样式 3、文本无法选中 4、字体间距 5、放大动画效果 6、CSS引用数字字体 7、CSS去角 8、CSS :after、:before、::after、::before的使用 9、CSS使用::after去除浮动 10、时间动画属性 transition 11、颜色渐变 12、解决…

javaWeb学生信息管理系统2

一、学生信息管理系统SIMS 一款基于纯Servlet技术开发的学生信息管理系统&#xff08;SIMS&#xff09;&#xff0c;在设计中没有采用SpringMVC和Spring Boot等框架。系统完全依赖于Servlet来处理HTTP请求和管理学生信息&#xff0c;实现了信息的有效存储、检索和更新&#xf…

React16源码: Component与PureComponent源码实现

概述 Component 就是组件, 这个概念依托于最直观的在react上的一个表现&#xff0c;那就是 React.Component我们写的组件大都是继承于 React.Component 这个baseClass 而写的类这个类代表着我们使用 react 去实现的一个组件那么在react当中不仅仅只有 Component 这一个baseCla…