【mysql】锁机制 - 4.插入意向锁

news2024/11/24 18:23:52

插入意向锁(Insert Intension Lock)

是实际在插入操作前,提出一个插入的意向,检查其所属的范围是否存在间隙锁。

注意,插入意向锁虽然叫做意向锁,但其本质上是一种间隙锁,因为意向锁是表锁,而插入意向锁是行锁。

MySql 手册 中对插入意向锁的解释:

插入意向锁是在插入一条记录行前,由 INSERT 操作产生的一种间隙锁。该锁用以表示插入意向,当多个事务在同一区间(gap)插入位置不同的多条数据时,事务之间不需要互相等待。假设存在两条值分别为 4 和 7 的记录,两个不同的事务分别试图插入值为 5 和 6 的两条记录,每个事务在获取插入行上独占的(排他)锁前,都会获取(4,7)之间的间隙锁,但是因为数据行之间并不冲突,所以两个事务之间并不会产生冲突(阻塞等待)。

插入意向锁的特点

  • 是一种特殊的间隙锁,用于锁定两个记录之间的间隙

  • 插入意向锁之间互不排斥,可以共存

  • 插入意向锁与间隙锁是互斥的,不能共存

那么问题来了:既然有了间隙锁,为什么还需要插入意向锁?

  • 间隙锁是为了防止其他事务的插入,为了防止幻读而设计的;插入意向锁是为了优化并发插入效率而设计的

  • 间隙锁之间可以共存,即:两个事务在同一时间可以拥有同一个间隙的间隙锁(因为间隙锁本质是为了防止插入)

  • 插入意向锁和间隙锁不能共存,即:两个事务不能在同一时间内,一个拥有间隙锁,另一个拥有该间隙的插入意向锁

  • 插入意向锁是配合着间隙锁使用的,二者相互配合才能实现可重复读

比如我们创建如下表结构:

CREATE TABLE IF NOT EXISTS `test1` (
    `id`   INT PRIMARY KEY,
    `name` VARCHAR(100)
);
INSERT INTO test1 (id, name) VALUES (15, 'A'), (20, 'B'), (30, 'C');

id

name

15

A

20

B

30

C

开启以下2个事务:

事务1

事务2

Begin;

Begin;

Time1

UPDATE test1 SET name = 'D' WHERE id = 25;

获得IX锁和20-30记录的间隙X锁

Time2

UPDATE test1 SET name = 'E' WHERE id = 26;

获得IX锁和20-30记录的间隙X锁

Time3

INSERT INTO test1 (id, name) VALUES (25, 'D');

等待20-30记录的插入意向锁

Time4

INSERT INTO test1 (id, name) VALUES (26, 'E');

等待20-30记录的插入意向锁

  • TIme1:事务1获得了意向排他锁和 (20, 30) 范围的间隙锁

  • Time2:事务2获得了意向排他锁和 (20, 30) 范围的间隙锁(意向锁和意向锁之间不会冲突,间隙锁和间隙锁之间也不会冲突)

  • TIme3:INSERT 操作尝试获得 (20, 30) 范围的插入意向锁,但被事务2的间隙锁阻塞

  • TIme4:INSERT 操作尝试获得 (20, 30) 范围的插入意向锁,但被事务1的间隙锁阻塞

因此循环等待造成了死锁。

可以查看 INNODB 死锁日志:

SHOW ENGINE INNODB STATUS;

输入日志内容:

...
------------------------
LATEST DETECTED DEADLOCK
------------------------
2024-11-21 15:24:06 0x16da9b000
*** (1) TRANSACTION:
TRANSACTION 2180072, ACTIVE 14 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1128, 2 row lock(s)
MySQL thread id 3296, OS thread handle 6156677120, query id 174792 localhost 127.0.0.1 root update
INSERT INTO test1 (id, name) VALUES (25, 'D')

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 508 page no 4 n bits 72 index PRIMARY of table `db-test`.`test1` trx id 2180072 lock_mode X locks gap before rec
Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 8000001e; asc     ;;
 1: len 6; hex 0000002143e2; asc    !C ;;
 2: len 7; hex 820000016d012a; asc     m *;;
 3: len 1; hex 43; asc C;;


*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 508 page no 4 n bits 72 index PRIMARY of table `db-test`.`test1` trx id 2180072 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 8000001e; asc     ;;
 1: len 6; hex 0000002143e2; asc    !C ;;
 2: len 7; hex 820000016d012a; asc     m *;;
 3: len 1; hex 43; asc C;;


*** (2) TRANSACTION:
TRANSACTION 2180073, ACTIVE 8 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1128, 2 row lock(s)
MySQL thread id 17733, OS thread handle 6154448896, query id 174796 localhost 127.0.0.1 root update
INSERT INTO test1 (id, name) VALUES (26, 'E')

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 508 page no 4 n bits 72 index PRIMARY of table `db-test`.`test1` trx id 2180073 lock_mode X locks gap before rec
Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 8000001e; asc     ;;
 1: len 6; hex 0000002143e2; asc    !C ;;
 2: len 7; hex 820000016d012a; asc     m *;;
 3: len 1; hex 43; asc C;;


*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 508 page no 4 n bits 72 index PRIMARY of table `db-test`.`test1` trx id 2180073 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 8000001e; asc     ;;
 1: len 6; hex 0000002143e2; asc    !C ;;
 2: len 7; hex 820000016d012a; asc     m *;;
 3: len 1; hex 43; asc C;;

*** WE ROLL BACK TRANSACTION (2)
...

参考:

MySQL :: MySQL 8.0 Reference Manual :: 17.7.1 InnoDB Locking

字节面试:加了什么锁,导致死锁的? | 小林coding

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

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

相关文章

Vue3 + Vite 项目引入 Typescript

文章目录 一、TypeScript简介二、TypeScript 开发环境搭建三、编译方式1. 自动编译单个文件2. 自动编译整个项目 四、配置文件1. compilerOptions基本选项严格模式相关选项(启用 strict 后自动包含这些)模块与导入相关选项 2. include 和 excludeinclude…

Cyberchef使用功能之-多种压缩/解压缩操作对比

cyberchef的compression操作大类中有大量的压缩和解压缩操作,每种操作的功能和区别是什么,本章将进行讲解,作为我的专栏《Cyberchef 从入门到精通教程》中的一篇,详见这里。 关于文件格式和压缩算法的理论部分在之前的文章《压缩…

Istio分布式链路监控搭建:Jaeger与Zipkin

分布式追踪定义 分布式追踪是一种用来跟踪分布式系统中请求的方法,它可以帮助用户更好地理解、控制和优化分布式系统。分布式追踪中用到了两个概念:TraceID 和 SpanID。 TraceID 是一个全局唯一的 ID,用来标识一个请求的追踪信息。一个请求…

Linux修改/etc/hosts不起作用(ping: xxx: Name or service not known)的解决方法——开启NSCD

​ 问题描述 起因是我在实验室云资源池的一台虚拟机(CentOS 8.5)上的/etc/hosts文件中为Fabric网络节点的域名指定了IP: IP可以ping通,但是ping域名时提示ping: xxx: Name or service not known。 问题本身应该是Linux通用的&a…

Python中Tushare(金融数据库)入门详解

文章目录 Python中Tushare(金融数据库)入门详解一、引言二、安装与注册1、安装Tushare2、注册与获取Token 三、Tushare基本使用1、设置Token2、获取数据2.1、获取股票基础信息2.2、获取交易日历2.3、获取A股日线行情2.4、获取沪股通和深股通成份股2.5、获…

【网络】网络抓包与协议分析

网络抓包与协议分析 一. 以太网帧格式分析 这是以太网数据帧的基本格式,包含目的地址(6 Byte)、源地址(6 Byte)、类型(2 Byte)、数据(46~1500 Byte)、FCS(4 Byte)。 Mac 地址类型 分为单播地址、组播地址、广播地址。 单播地址:是指第一个字节的最低位…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.(只演⽰部分常⽤的⼯作模式) 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …

python学习_3.正则表达式

来源:B站/麦叔编程 1. 正则表达式的7个境界 假设有一段文字: text 身高:178,体重:168,学号:123456,密码:9527要确定文本中是否包含数字123456,我们可以用in运算符,也可以使用inde…

Python学习------第十天

数据容器-----元组 定义格式,特点,相关操作 元组一旦定义,就无法修改 元组内只有一个数据,后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…

nodejs基于微信小程序的云校园的设计与实现

摘 要 相比于传统的校园管理方式,智能化的管理方式可以大幅提高校园的管理效率,实现了云校园管理的标准化、制度化、程序化的管理,有效地防止了云校园信息的不规范管理,提高了信息的处理速度和精确度,能够及时、准确地…

Excel——宏教程(精简版)

一、宏的简介 1、什么是宏? Excel宏是一种自动化工具,它允许用户录制一系列操作并将其转换为VBA(Visual Basic for Applications)代码。这样,用户可以在需要时执行这些操作,以自动化Excel任务。 2、宏的优点 我们可以利用宏来…

绿光一字线激光模组:工业制造与科技创新的得力助手

在现代工业制造和科技创新领域,绿光一字线激光模组以其独特的性能和广泛的应用前景,成为了不可或缺的关键设备。这种激光模组能够发射出一条明亮且精确的绿色激光线,具有高精度、高稳定性和长寿命的特点,为各种精密加工和测量需求…

Python Turtle绘图:重现汤姆劈树的经典瞬间

Python Turtle绘图:重现汤姆劈树的经典瞬间 🦀 前言 🦀🐞往期绘画🐞🐋 效果图 🐋🐉 代码 🐉 🦀 前言 🦀 《汤姆与杰瑞》(Tom and Jerr…

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案(二)

Oracle - 多区间按权重取值逻辑 ,分时区-多层级-取配置方案https://blog.csdn.net/shijianduan1/article/details/133386281 某业务配置表,按配置的时间区间及组织层级取方案,形成报表展示出所有部门方案的取值; 例如&#xff0…

DataGear 5.2.0 发布,数据可视化分析平台

DataGear 企业版 1.3.0 已发布,欢迎体验! http://datagear.tech/pro/ DataGear 5.2.0 发布,图表插件支持定义依赖库、严重 BUG 修复、功能改进、安全增强,具体更新内容如下: 重构:各模块管理功能访问路径…

详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)

文章目录 前言1.插入排序(InsertSort)1.1 核心思路1.2 实现代码 2.选择排序(SelectSort)2.1 核心思路2.2 实现代码 3.冒泡排序(BubbleSort)3.1 核心思路3.2 实现代码 4.希尔排序(ShellSort&…

02 —— Webpack 修改入口和出口

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 修改入口 webpack.config.js (放在项目根目录下) module.exports {//entry设置入口起点的文件路径entry: ./path/to/my/entry/file.js, }; 修改出口 webpack.config.js const path r…

《InsCode AI IDE:编程新时代的引领者》

《InsCode AI IDE:编程新时代的引领者》 一、InsCode AI IDE 的诞生与亮相二、独特功能与优势(一)智能编程体验(二)多语言支持与功能迭代 三、实际应用与案例(一)游戏开发案例(二&am…

ubuntu 16.04 中 VS2019 跨平台开发环境配置

su 是 “switch user” 的缩写,表示从当前用户切换到另一个用户。 sudo 是 “superuser do” 的缩写,意为“以超级用户身份执行”。 apt 是 “Advanced Package Tool” 的缩写,Ubuntu中用于软件包管理的命令行工具。 1、为 root 用户设置密码…

[Docker#11] 容器编排 | .yml | up | 实验: 部署WordPress

目录 1. 什么是 Docker Compose 生活案例 2. 为什么要使用 Docker Compose Docker Compose 的安装 Docker Compose 的功能 使用步骤 核心功能 Docker Compose 使用场景 Docker Compose 文件(docker-compose.yml) 模仿示例 文件基本结构及常见…