简识MySQL的InnoDB Locking锁的分类
( 参考官方网页: MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking)
一、InnoDB Locking锁的分类:
| 锁的分类 | 英文 | 缩写 |
|---|---|---|
| 共享锁 | Shared Locks | S |
| 排他锁 | Exclusive Locks | X |
| 意向共享锁 | Intention Shared Locks | IS |
| 意向排他锁 | Intention Exclusive Locks | IX |
| 记录锁 | Record Locks | - |
| 间隙锁 | Gap Locks | - |
| 下一键值锁(临键锁) | Next-Key Locks | - |
| 插入意向锁 | Insert Intention Locks | - |
| 自动插入锁(自增锁) | AUTO-INC Locks | - |
以下是对各类锁的具体说明:
- 共享锁(S锁):允许持有共享锁的事务读取一行数据,但不允许修改或删除。在MySQL的InnoDB引擎中,它是行级锁的一种。
- 排他锁(X锁):允许持有排他锁的事务更新或删除一行数据,同时阻止其他事务读取、修改或删除该行数据。在MySQL的InnoDB引擎中,它也是行级锁的一种。
- 意向共享锁(IS锁):表示一个事务打算在表的单独数据行上设置共享锁。它是表级锁,用于锁定表,以表示稍后将对表中的某些行加共享锁。
- 意向排他锁(IX锁):表示一个事务打算在表的单独数据行上设置排他锁。它也是表级锁,用于锁定表,以表示稍后将对表中的某些行加排他锁。
- 记录锁:索引记录上的一个锁,锁住单个行记录。在InnoDB中,即使表上没有定义索引,也会创建一个隐式簇索引,并用该索引进行记录锁定。
- 间隙锁:索引记录之间间隙上的锁,或第一个索引记录之前或最后一个索引记录之后间隙上的锁。间隙锁是“纯粹禁止的”,它们只是阻止其他事务往指定间隙插入数据,而不阻止不同事务在同一个间隙上获取间隙锁。
- 下一键值锁(临键锁):Record Lock和Gap Lock的结合,锁定一个范围,并且锁定记录本身。这种锁在InnoDB中用于防止幻读现象。
- 插入意向锁:间隙锁的一种,专门针对insert操作。当多个事务需要向同一个间隙中插入数据时,插入意向锁允许这些事务并行插入,而不会互相阻塞。
- 自动插入锁(自增锁):一种特殊的表级别锁,专门针对事务插入AUTO_INCREMENT类型的列。当一个事务正在向表中插入值时,其他事务必须等待,以便第一组事务插入的行接收到连续的主键值。
这些锁机制共同构成了InnoDB强大的并发控制功能,使得MySQL数据库能够在高并发环境下稳定运行。
二、InnoDB中部分锁的举例说明:
1. 共享锁(S锁)
共享锁允许多个事务同时读取同一行数据,但不能修改该数据。
示例:
- 事务1开始,并在
id = 1的行上放置共享锁:SELECT * FROM your_table WHERE id = 1 LOCK IN SHARE MODE; - 事务2开始,也可以在
id = 1的行上放置共享锁并查询:SELECT * FROM your_table WHERE id = 1 LOCK IN SHARE MODE;
在这个例子中,两个事务都可以同时对id = 1的行加共享锁并读取数据。
2. 排他锁(X锁)
排他锁允许事务独占一行数据,其他事务既不能读取也不能修改。
示例:
- 事务1开始,并在
id = 2的行上放置排他锁:SELECT * FROM your_table WHERE id = 2 FOR UPDATE; - 事务2开始,尝试在同一行查询(会被阻塞,因为有排他锁):
SELECT * FROM your_table WHERE id = 2;
在这个例子中,事务1在id = 2的行上放置了排他锁,事务2尝试读取这一行时就会被阻塞,直到事务1提交或回滚。
3. 意向锁(IS锁和IX锁)
意向锁用于表示事务想要在更高级别上获取锁(如表级锁)。意向锁是表级别的锁,不与行级锁冲突。
示例(意向共享锁IS):
- 事务1开始,先在表上放置意向共享锁,表示想要获取表级共享锁:
LOCK TABLE your_table IN SHARE MODE; - 事务2开始,尝试直接在表上进行独占操作(会被阻塞,因为有表级的意向共享锁):
LOCK TABLE your_table IN EXCLUSIVE MODE;
在这个例子中,事务1先在表上放置了意向共享锁,事务2尝试获取表的排他锁时就会被阻塞。
示例(意向排他锁IX):
- 事务1开始执行
SELECT ... FOR UPDATE语句,此时会对所查询的记录加排他锁,并先对表加意向排他锁。
4. 记录锁
记录锁用于锁定单个行记录。
示例:
- 假设表
your_table有字段id和name,事务1开始并更新id = 3的行,会在该行上放置记录锁:UPDATE your_table SET name = 'new_name' WHERE id = 3; - 事务2开始,尝试更新同一行(会被阻塞,因为有记录锁):
UPDATE your_table SET name = 'another_name' WHERE id = 3;
在这个例子中,事务1在id = 3的行上放置了记录锁,事务2尝试更新同一行时就会被阻塞。
5. 间隙锁
间隙锁用于锁定索引记录之间的“间隙”,但不锁定索引记录本身。
示例:
- 假设表
your_table的id字段是索引,且有值1、3、5。事务1开始,查询id在1到3之间(不包含1和3)的数据并加锁,会在这个间隙上加间隙锁:SELECT * FROM your_table WHERE id > 1 AND id < 3 FOR UPDATE; - 事务2开始,尝试插入
id = 2的数据(会被阻塞,因为有间隙锁):INSERT INTO your_table (id, name) VALUES (2, 'new_entry');
在这个例子中,事务1在1和3之间的间隙上加了间隙锁,事务2尝试插入id = 2的数据时就会被阻塞。
6. 下一键值锁(临键锁)
临键锁是记录锁和间隙锁的组合,用于锁定一个索引记录及其前面的间隙。
示例:
- 假设表
your_table的id字段是索引,且有值1、3、5。事务1开始,查询id = 3的数据并加锁,会在id = 3的记录及其前面的间隙上加临键锁:SELECT * FROM your_table WHERE id = 3 FOR UPDATE; - 事务2开始,尝试插入
id = 2的数据(会被阻塞,因为有临键锁锁定了id = 3前面的间隙):INSERT INTO your_table (id, name) VALUES (2, 'new_entry'); - 事务2尝试更新
id = 3的数据(会被阻塞,因为有临键锁锁定了id = 3的记录):UPDATE your_table SET name = 'updated_name' WHERE id = 3;
在这个例子中,事务1在id = 3的记录及其前面的间隙上加了临键锁,事务2尝试插入或更新时都会被阻塞。
7. 插入意向锁
插入意向锁是间隙锁的一种,专门针对insert操作。多个事务在同一个索引、同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。
示例(假设与间隙锁示例中的表结构和数据相同):
- 事务1在1和3之间的间隙上尝试插入
id = 2的数据(加插入意向锁)。 - 事务2也在1和3之间的间隙上尝试插入
id = 2.5的数据(加插入意向锁,与事务1不冲突)。
在这个例子中,尽管事务1和事务2都在同一个间隙上尝试插入数据,但由于它们插入的位置不冲突(一个是2,一个是2.5),因此它们可以并行插入而不会互相阻塞。
8. 自动插入锁(自增锁)
自增锁是一种特殊的表级别锁,专门针对事务插入AUTO_INCREMENT类型的列。当一个事务正在向表中插入值时,其他事务必须等待,以便第一组事务插入的行接收到连续的主键值。
示例:
- 假设有数据表
t(id AUTO_INCREMENT, name),数据表中有数据:1, shenjian;2, zhangsan;3, lisi。 - 事务A先执行(还未提交):
insert into t(name) values('xxx');会得到一条(4, xxx)的记录。 - 事务B后执行:
insert into t(name) values('ooo');此时需要等待事务A提交后才能继续执行,因为InnoDB在RR隔离级别下使用自增锁来解决幻读问题。
在这个例子中,事务A先执行插入操作并获得了自增锁,因此事务B必须等待事务A提交后才能继续执行插入操作,以确保插入的主键值是连续的。
这些示例展示了InnoDB中各种锁的使用场景和工作方式。在实际应用中,需要根据具体的业务需求和并发控制要求来选择合适的锁类型。
(望各位潘安、各位子健不吝赐教!多多指正!🙏)
相关文章:
简识MySQL的InnoDB Locking锁的分类
( 参考官方网页: MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking) 一、InnoDB Locking锁的分类: 锁的分类英文缩写共享锁Shared LocksS排他锁Exclusive LocksX意向共享锁Intention Shared LocksIS意向排他锁Int…...
如何通过openssl生成.crt和.key
生成 .crt(证书文件)和 .key(私钥文件)的过程通常涉及使用加密工具或库来创建密钥对,并生成证书请求,最终由证书颁发机构(CA)或自签名生成证书。以下是生成 .crt 和 .key 文件的详细…...
.NetCore 使用 NPOI 读取带有图片的excel数据
在.NetCore使用NPOI插件进行批量导入时,获取Excel中的所有的图片数据,存到集合中。 1.定义类PictureData 代码如下: public class PictureData { public byte[] Data { get; set; } } 2.数据集引用 using NPOI.XSSF.UserModel; usin…...
linux上使用update-alternatives来选择软件版本
比如我在linux系统上安装多个版本的gcc /usr/local/gcc-4.8.2/ /usr/local/gcc-8.4.0/ /usr/local/gcc-9.4.0/我要根据需要来切换系统环境下的gcc命令的版本,我可以先 update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-4.8.2/bin/gcc 1 update-alt…...
【Elasticsearch复合查询】
Elasticsearch复合查询 在Elasticsearch中,复合查询(Compound Queries)是用来封装其他复合查询或叶子查询的查询类型。它们的主要目的是组合这些查询的结果和分数、改变它们的行为或者从查询上下文切换到过滤上下文。 一个常见的复合查询是…...
Java List去重:Stream、HashMap与TreeSet对比分析
在处理包含重复元素的List时,高效地去除重复项是提高数据质量的关键步骤。本文将详细介绍如何运用Java 8 Stream API、HashMap以及TreeSet来实现List去重,并比较它们之间的优缺点及适用场景。 1. 使用Stream API去重 List<String> duplicates …...
大师课程:专业角色AE+AI动画动态设计关键帧学院视频课程 Key Frame Academy – Character Animation Launchpad
使用专业角色动画升级您的动态设计。我将流程的每个阶段分解为易于理解的步骤,以便您可以自信、无缝地创建迫不及待地向客户展示的专业角色动画。 您的创造力就是您的超能力。但说到经验,没有什么比索具过程更能扼杀我的创作火花了……对于许多人来说&am…...
游戏盾SDK如何防护APP攻击
游戏盾SDK如何防护APP攻击?在数字时代的大潮中,APP的安全性是衡量其服务质量与用户信任度的关键指标之一。面对日益复杂多变的网络攻击,如何确保APP在开放的网络环境中稳健运行,成为开发者面临的一大挑战。游戏盾SDK,作…...
Spring Boot 3.x 整合 Logback 日志框架(支持异步写入)
Spring Boot 3.x 整合 Logback 日志框架(支持异步写入) 在构建任何应用程序时,良好的日志管理都是必不可少的。日志可以帮助我们监控、调试和跟踪代码的运行情况。 1. 添加日志配置文件 在 /resources 资源目录下,创建名为 log…...
从0开始学习搭网站第二天
前言:今天比较惭愧,中午打铲吃了一把,看着也到钻二了,干脆顺手把这个赛季的大师上了,于是乎一直到网上才开始工作,同样,今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…...
【Unity-Animator】通过 StateMachineBehaviour 实现回调
StateMachineBehaviour 简介 StateMachineBehaviour是一个基类,所有状态脚本都派生自该类。它可以在状态机进入、退出或更新状态时执行代码,而无需编写自己的逻辑来测试和检测状态的变化。这使得开发者可以更方便地处理状态转换时的逻辑,例…...
鸿蒙中自定义slider实现字体大小变化
ui: import { display, mediaquery, router } from kit.ArkUI import CommonConstants from ./CommonConstants; import PreferencesUtil from ./PreferencesUtil; import StyleConstants from ./StyleConstants;// 字体大小 Entry Component struct FontSize {Sta…...
数据结构与算法之栈: LeetCode 71. 简化路径 (Ts版)
简化路径 https://leetcode.cn/problems/simplify-path/description/ 描述 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为 更加简洁的规范路径 在 Unix 风格的文件系统中…...
STM32-笔记40-BKP(备份寄存器)
一、什么是BKP(备份寄存器)? 备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或…...
NAS中不同RAID级别特点与适用场景
1. RAID 0(条带化) 硬盘数量:至少2块。硬盘要求:硬盘容量可以不同,但总容量以最小硬盘为准(例如:1TB 2TB 2TB,其中1TB会被浪费)。优点: 读写性能显著提升&…...
node.js的进程保活
nodejs的进程保活其实用PM2应该更好用些,不过由于原理其实并不复杂,我们可以自己手写一个服务来干这个工作。 假设我们有一个服务,可以这样来定义下它的相关信息: const svcs[ {"sid":"apl","name"…...
meta name=“viewport“ content=“width=device-width, initial-scale=1.0“
meta name“viewport” content“widthdevice-width, initial-scale1.0” 这段代码在网页设计中扮演着非常重要的角色,尤其是在响应式设计中。下面是对这段代码的详细解释及其在响应式设计中的作用: 1. 代码含义 html Copy Code meta 标签是 HTML 中用…...
【vue3】 defineExpose 的使用
以下是 Vue3 中defineExpose的使用方法: 基本概念 defineExpose是 Vue3 中的一个工具函数,是仅能在<script setup>中使用的函数,用于显式暴露组件内部的属性或方法给父组件使用2。在 Vue3 的<script setup>中,组件的…...
思维转换:突破思维桎梏,创造更高效的工作与生活
在现代职场和生活中,我们经常面临着各种挑战和问题,有时候虽然付出了很多努力,但依然难以找到更有效的解决方案。这时,或许我们需要的不是更多的努力,而是一次“思维转换”。这一概念看似简单,但它背后却蕴…...
OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 根据3D-2D点对应关系找到物体的姿态。 cv::solvePnPGeneric 是 OpenCV 中一个更为通用的函数,用于解决 PnP 问题。它能够返回多个可能…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
