简识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 问题。它能够返回多个可能…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
