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.hqwc.cn/news/311112.html

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

相关文章

混凝土支撑模板的安装技巧有哪些?

在建筑工程中,混凝土支撑模板的正确安装对于确保结构的安全和工程的顺利进行至关重要。以下是一些实用的安装技巧,可以帮助施工人员更有效地安装混凝土支撑模板: 1. 熟悉设计和施工图纸 在安装前,彻底熟悉设计和施工图纸是非常重…

精致旅游网ROXANDREA 网页设计 html模板

一、需求分析 旅游网站通常具有多种功能,以下是一些常见的旅游网站功能: 酒店预订:旅游网站可以提供酒店预订服务,让用户搜索并预订符合其需求和预算的酒店房间。 机票预订:用户可以通过旅游网站搜索、比较和预订机票…

基于EPICS modbus模块的一通道电压监测项目

先介绍在本项目中使用到的硬件: 1)开发板:为香橙派Zero2,安装系统如下: Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy 2) USB转485模块&…

AJAX: 整理2:学习原生的AJAX,这边借助express框架

1. npm install express 终端直接安装 2. 测试案例:Hello World! 新建一个express.js的文件,写入下方的内容 // 1. 引入express const express require(express)// 2. 创建服务器 const app express()// 3.创建路由规则 // request 是对请…

蓝桥杯真题位运算

位运算:对二进制进行操作的运算方式 与运算:有0得0 或运算:有1得1 异或运算:相同为0、不同为1取反 左移、右移 与运算&:有0则为0,全1为1 或运算|:有1则为1,全0为0 异或运算^:相同为0、不同为1 交换律: x^yy ^x 结合律: x ^(y ^z)(x ^y)^z …

《微信小程序开发从入门到实战》学习六十七

6.6 网络API 部分小程序服务端不是用云开发技术实现,而是由开发人员使用后端开发语言实现。 在小程序用网络API与(开发人员使后端开发语言建设的)服务端进行交互,可与服务端交换数据、上传或下载文件。 6.6.1 服务器域名配置 …

Langchain-Chatchat开源库使用的随笔记(一)

笔者最近在研究Langchain-Chatchat,所以本篇作为随笔记进行记录。 最近核心探索的是知识库的使用,其中关于文档如何进行分块的详细,可以参考笔者的另几篇文章: 大模型RAG 场景、数据、应用难点与解决(四)R…

Termius for Mac/Win:一站式终端模拟器、SSH 和 SFTP 客户端软件的卓越选择

随着远程工作和云技术的普及,对于高效安全的远程访问和管理服务器变得至关重要。Termius,一款强大且易用的终端模拟器、SSH 和 SFTP 客户端软件,正是满足这一需求的理想选择。 Termius 提供了一站式的解决方案,允许用户通过单一平…

华清远见作业第十六天

思维导图: 双向循环链表头插入: 代码: Doublelist insert_head(Doublelist head,datatype element) {//创建新节点sDoublelist screate_node();if(NULLs){return head;}s->dataelement;//数据存储//判断链表是否为空if(NULLhead){heads;…

使用Vue.js实现手机系统检测和页面响应

题目:使用Vue.js实现手机系统检测和页面响应 摘要:本文将介绍如何使用Vue.js来检测用户的手机操作系统,并根据操作系统类型进行相应的页面响应。我们将通过编写一个Vue组件,利用用户代理字符串来检测设备类型,并根据检…

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里,甚至几千公里)时,就需要另一种结构的网络,即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…

QString设置小数点精度位数

QString设置小数点精度位数 Chapter1 QString设置小数点精度位数Chapter2 Qt中QString.toDouble有效位数6位问题以及数据小数点有效位数的处理问题一:QString.toDouble有效位只有6位问题二:小数点有效位数的问题 Chapter3 qt QString转Double只显示6位数字的问题(精…