什么是MySQL插入意向锁?

news2024/12/26 4:30:26

Insert Intention Lock,中文我们也称之为插入意向锁。

这个可以算是对我们之前所讲的 Gap Lock 的一个补充,关于 Gap Lock,如果还有小伙伴不懂,可以参考:记录锁、间隙锁与 Next-Key Locks。

1. 为什么需要插入意向锁

我们之前已经有 Gap Lock 了,Gap Lock 可以帮我们在一定程度上解决幻读问题,但是,之前的似乎有点问题。

假设我有如下一张表:

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

id 是主键自增;age 是一个普通索引,现在表中有如下数据:

假设我想执行如下的插入 SQL:

begin;
insert into user(username,age) values('wangwu',95);

注意,这个 SQL 执行了但是事务还没有提交。

按照我们之前学习的关于 Gap Lock 的知识分析一下,此时间隙锁的范围是 (89,99),意思是这个范围的 age 都不可以插入。

如果是这样的话,小伙伴们会发现数据插入的效率可就太低了,很容易发生锁冲突,那么怎么办?

我们今天要介绍的插入意向锁就是用来解决这个问题的。

2. 什么是插入意向锁

我们来看看 MySQL 官网的介绍:

An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6, respectively, each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting.

大致翻译下一下就是这样:

插入意向锁是一种在 INSERT 操作之前设置的一种间隙锁,插入意向锁表示了一种插入意图,即当多个不同的事务,同时往同一个索引的同一个间隙中插入数据的时候,它们互相之间无需等待,即不会阻塞(要是单纯按照之前间隙锁的理论,必须要等一个间隙锁释放了,下一个事务才可以往相同的间隙处插入数据)。假设有值为 4 和 7 的索引记录,现在有两个事务,分别尝试插入值为 5 和 6 的记录,在获得插入行的排他锁之前,每个事务使用插入意向锁锁定 4 和 7 之间的间隙,但是这两个事务不会相互阻塞,因为行是不冲突的。

这就是插入意向锁。

3. 实践

小伙伴们注意,松哥之前和大家聊 Gap Lock,说过这个是可重复读(REPEATABLE READ)这个隔离级别下特有的产物,那么现在 Insert Intention Lock 是一种特殊的 Gap Lock,当然也是在可重复读这个隔离级别下生效。

接下来我们通过两个个简单的案例来演示一下插入意向锁。

3.1 案例一

我们的表结构以及数据和第一小节一致。

首先我们在会话 A 中,执行如下代码:

现在会话 A 中的事务没有提交。

接下来我们在会话 B 中,也执行一个插入操作:

我们发现会话 B 也可以正常执行,没有发生阻塞。

这说明,两个插入意向锁之间是兼容的,可以共存的。

3.2 案例二

我们再来看一个不兼容的例子。

首先在会话 A 中执行如下 SQL 查询 age 大于 80 的记录,并添加排他锁:

接下来在会话 B 中,执行如下代码插入一行数据:

小伙伴们看到,这个操作会被阻塞!阻塞的原因在于,插入意向锁和排他锁之间是互斥的。

趁着发生阻塞的这会,在会话 C 中,我们通过在前面文章中所使用的 show engine innodb status\G 指令,来查看下加锁的情况,重点看 TRANSACTION 节点:

在输出的内容中,红色框选中的地方,清楚的表明了插入意向锁的存在。

4. 小结

总结一下:

  1. 插入意向锁虽然名字中有意向二字,但实际上是一个特殊的间隙锁。
  2. 插入意向锁之间不互斥。
  3. 插入意向锁和排他锁之间互斥。

好啦,有问题欢迎留言讨论。

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

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

相关文章

吃透Chisel语言.40.Chisel实战之单周期RISC-V处理器实现(下)——具体实现和最终测试

Chisel实战之单周期RISC-V处理器实现(下)——具体实现和最终测试 上一篇文章中我们对本项目的需求进行了分析,并得到了初步的设计,这一篇文章我们就可以基于该设计来实现我们的单周期RISC-V处理器了。实现之后也必须用实际代码来…

[ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

文章目录前言一、常见的排序算法二、希尔排序2.1 希尔排序(缩小增量排序)2.1.1 预排序阶段2.1.2 插入排序阶段2.2 单趟希尔排序2.2.1 思路分析三、希尔排序实现代码四、希尔排序的时间复杂度五、希尔排序和直接插入排序效率测试5.1 测试5.2 结论5.2.1 随机数比较5.2.2 有序数组…

【二维码识别】灰度+二值化+校正二维码生成与识别【含GUI Matlab源码 635期】

⛄一、二维码生成与识别简介 如今,移动互联网技术日新月异,随着5G时代的来临,广泛应用于数据处理过程中的二维码信息安全日益成为人们越来越关注的问题。以QR码为代表的二维码,以其在信息存储、传输和识别技术领域优异的表现,成为信息共享、移动支付等领域的宠儿。不可避免地,…

利用深度学习生成数据的时间序列预测(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 数据分析研究目前仍是行业热点,相关学者从数据分析关键技术中的异常检测、入侵检测、时间序列预测等角度展开研究。然而,现有研…

Go环境搭建与IDE开发工具配置

安装Go语言编译器 Go语言编译器》编译器将源代码编译为可执行程序》源代码程序员使用高级语言所书写的代码文件》高级语言c/c/go…》机器语言0和1构成,机器能直接识别》汇编语言比机器语言稍微可读一点点的指令集 编译器下载地址 根据系统下载对应的go编译器版本…

微信小程序保存相册授权全过程:第一次授权、已授权、拒绝后再授权

微信小程序部分功能需要使用授权(也就是需要用户显式同意,系统会阻止开发者任何静默获取授权行为),以存储相册为例,用户需要获得"scope.writePhotosAlbum"权限 微信系统接口wx.getSetting可以获取已经获得的…

MySQL连接数据库

①MySQLpymysql ②django开发操作数据库,orm框架 安装第三方模块:orm pip install mysqlclient ORM Django链接数据库 在settings.py中修改 查看创建的数据库的端口号和用户名: Django操作表: 创建表 models.py from django…

[附源码]Python计算机毕业设计Django新冠疫苗接种预约系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

PDF怎么插入页?将页面添加到 PDF 文档的 3 种简单方法

得益于现代技术,我们现在可以轻松地合并、创建、编辑 PDF 并执行更多操作。使用专业的PDF程序在PDF文档中插入一页问题不大。这篇文章将介绍如何使用 奇客PDF编辑 和其他四个桌面和在线程序向 PDF 添加页面。 如何使用桌面程序将页面添加到 PDF 毫无疑问&#…

Simulink基础【2】- PID控制器

Simulink基础【2】- PID控制器1. Simulink作用回顾1.1 模块化1.2 常用模块1.2.1 输入信号源模块库(Sources)1.2.2 接收模块库(Sinks)1.2.3 系统模块1.2.4 数学运算模块1.3 界面布局与使用1.4 自定义模块2. PID算法仿真2.1 PID算法…

配置pytorch环境

一、安装cuda cudnn 1.下载cuda ,根据上一步安装pytorch的cuda版本对应,我的是cuda11.6 安装无脑下一步就可以了。 2.1下载cuDNN cuDNN 其实就是 CUDA 的一个补丁而已,专为深度学习运算进行优化的 2.2 配置cuDNN 解压压缩包,将文件夹里bin、…

Echarts中常用的参数总结以及参数自定义示例

🐱个人主页:不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏&#xff…

Springboot之Actuator的渗透测试和漏洞修复

Actuator 的 REST 接口 Actuator监控分成两类:原生端点和用户自定义端点;自定义端点主要是指扩展性,用户可以根据自己的实际应用,定义一些比较关心的指标,在运行期进行监控。 原生端点是在应用程序里提供众多 Web 接口…

返回字典中的键值对dict.items()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 返回字典中的键值对 dict.items() [太阳]选择题 对下面描述错误的选项为? myDic {"A":1, "B":2} print("【显示】myDic",myDic) print("【显…

安全智能分析技术 模型自动化调优

安全分析模型自动化调优 MLOps(Machine Learning Operations)是一种人工智能 的工程实践,是面向机器学习项目的研发运营管理体系 。旨在实现 ML 管道的操作、ML 模型的部署和管理标准化,支持ML 模型的发布、激活、监控、性能跟踪…

【有料c++题目周刊 | 第三期】复兴时代

文章目录第一题:最佳圆柱体直径题目描述输入格式输出格式输入样例输出样例解题思路&C题解第二题:贪心国王题目描述输入格式输出格式数据范围输入样例输出样例解题思路&C题解第一题:最佳圆柱体直径 题目描述 在复兴时期,…

DevOps实战系列【第十二章】:详解Shared Libraries共享库

个人亲自录制全套DevOps系列实战教程 :手把手教你玩转DevOps全栈技术 随着jenkins pipeline项目越来越多,冗余代码也越来越多,所以share library诞生。 流水线支持在外部仓库中创建【共享库】,然后加载到现有流水线中使用&#xf…

XXL-Job分布式任务调度框架-- 集群HA的配置3

一 xxl-job集群概述 1.1 xxl-job集群HA的作用 为了避免单点故障,任务调度系统通常需要通过集群实现系统高可用 由于任务调度系统的特殊性,“调度”和“任务”两个模块需要均支持集群部署,由于职责不同,因此各自集群侧重点也有…

AcWing第82场周赛

目录 1.第k个数 2. 多米诺骨牌 3.构造序列 1.第k个数 题目描述 给定一个长度为n的整数序列,a1,a2,...,an,以及一个整数k,请你计算该数列从大到小排序后的第k个数。 输入格式 第一行包含两个整数n,k 第二行n个整数 输出格式 输出一个数&…

Sqoop安装教程

Sqoop安装教程 文章目录Sqoop安装教程一、资料二、安装(一)上传文件(二)解压文件,并重命名(三)修改配置文件1、进入到/opt/module/sqoop/conf中2、修改配置文件(1)将sqoop环境的模板文件&#x…