MySQL中的行锁、临建锁、间隙锁和表锁中的意向锁

news2024/11/16 17:31:22

文章目录

  • 一、行锁
    • Q:MySQL行锁有哪些使用场景
    • Q:MySQL那些命令会导致发生行锁?
  • 二、间隙锁(Gap Lock)
    • 间隙锁有哪些使用场景
  • 三、临建锁(Next-Key Lock)
  • 四、表锁
    • 意向锁(Intention Lock)
    • 作用
      • 为什么意向锁是表级锁呢?
      • 意向锁怎么支持表锁和行锁并存?
      • 如何查看

一、行锁

行级锁是MySQL中的一种锁定机制,它可以对数据库表中的单独一行进行锁定。相比于表级
锁和页锁,行级锁的粒度更小,因此在处理高并发事务时,能提供更好的并发性能和更少的
锁冲突。然而,行级锁也需要更多的内存和CPU资源,因为需要对每一行都进行管理。
在MySQL中,行级锁主要由InnoDB存储引擎提供。InnoDB支持两种类型的行级锁:共享锁
(S锁)和排他锁(X锁)。

  1. 共享锁(S锁):共享锁也称为读锁,它允许一个事务读取一行数据。当一行数据被共享
    锁锁定时,其他事务可以读取这行数据,但不能对其进行修改。
  2. 排他锁(X锁):排他锁也称为写锁,它允许一个事务读取和修改一行数据。当一行数据
    被排他锁锁定时,其他事务不能读取也不能修改这行数据。
    在实际使用中,InnoDB还提供了一种名为“间隙锁”(Gap Lock)的特性。间隙锁不仅锁
    定一个具体的行,还锁定它前后的“间隙”,即这一行之前的行和之后的行之间的空间。间
    隙锁可以防止其他事务插入新的行到已锁定行的前后,从而可以解决一些并发问题。
    值得注意的是,行级锁只在事务中有效,也就是说,只有在一个事务开始(BEGIN)后并在
    事务提交(COMMIT)或回滚(ROLLBACK)之前,才能对数据行进行锁定。如果在非事务
    环境中执行SQL语句,那么InnoDB会在语句执行结束后立即释放所有的锁。

Q:MySQL行锁有哪些使用场景

MySQL中的行级锁(Row Level Locks)通常在以下几种场景中被使用:

  1. 高并发读写操作:在需要高并发读写操作的场景中,行级锁可以提高性能和并发性,因为
    它允许多个事务并发地操作不同的行。
  2. 单行操作:对于需要操作单行数据的SQL语句(例如基于主键或者唯一索引的UPDATE、
    DELETE和INSERT语句),行级锁可以提供较好的并发性和性能。
  3. 短期锁:在需要对数据行进行短时间锁定的情况下,行级锁可以防止长时间阻塞其他事
    务。
  4. 实现并发控制:在需要确保数据一致性和隔离性的事务中,行级锁是实现并发控制的重要
    机制。
  5. 复杂的事务处理:在需要对多行数据进行复杂处理的事务中,可以使用行级锁来锁定这些
    行,防止在事务处理过程中数据被其他事务修改。
    使用行级锁需要注意,由于行级锁的锁定粒度较小,它可能会消耗更多的系统资源(例如内
    存和CPU),特别是在处理大量数据时。此外,使用行级锁也可能导致死锁,需要使用合适
    的策略来避免死锁,例如在事务中按照一定的顺序锁定行。

Q:MySQL那些命令会导致发生行锁?

在MySQL中,主要是InnoDB存储引擎提供了行级锁(Row Level Locking)。一般来说,以
下这些类型的操作会导致InnoDB对数据行进行加锁:

  1. SELECT … FOR UPDATE:这种查询会对选定的行添加一个排他锁(X锁),这意味着
    其他事务不能修改这些行,也不能对这些行添加共享锁。
  2. SELECT … LOCK IN SHARE MODE:这种查询会对选定的行添加一个共享锁(S
    锁),这意味着其他事务不能修改这些行,但可以对这些行添加共享锁。
  3. INSERT:插入操作会对新添加的行添加一个排他锁(X锁)。
  4. UPDATE:更新操作会对被更新的行添加一个排他锁(X锁)。
  5. DELETE:删除操作会对被删除的行添加一个排他锁(X锁)。
    这些加锁操作都是在事务中进行的,即只有在事务开始(BEGIN)后并在事务提交
    (COMMIT)或回滚(ROLLBACK)之前,才会对数据行进行加锁。如果在非事务环境中执
    行上述SQL语句,那么InnoDB会在语句执行结束后立即释放所有的锁。
    请注意,加锁的粒度和范围取决于WHERE子句中用到的索引。如果WHERE子句中用到了唯
    一索引(例如主键索引),那么InnoDB只会锁定匹配的行。如果没有用到唯一索引,那么
    InnoDB可能会锁定更多的行,甚至是整个表,这就可能导致锁冲突和性能问题。
    此外,InnoDB还支持间隙锁(Gap Locks)和临键锁(Next-Key Locks),这两种锁都可以
    在某些情况下提供更好的并发控制。

二、间隙锁(Gap Lock)

间隙锁(Gap Locks)是MySQL InnoDB存储引擎提供的一种锁定机制。它锁定的不是具体
的行记录,而是两个索引之间的间隙(或者说区间),这样可以防止新的记录插入到该间
隙,确保数据的一致性和事务的隔离性。
间隙锁常常与记录锁(Record Locks)一起使用,共同形成Next-Key锁,保护索引记录的范
围查询和扫描操作。
以下是间隙锁的主要类型:

  1. 区间-区间间隙锁:锁定两个索引键之间的间隙,或者是第一个索引键之前的间隙。
  2. 区间-记录间隙锁:锁定一个索引键和一个记录之间的间隙。
  3. 记录-区间间隙锁:锁定一个记录和一个索引键之间的间隙。
    间隙锁的存在,主要是为了解决幻读问题。所谓幻读,是指在一个事务内读取某个范围的记
    录时,另外一个事务在该范围内插入了新的记录,当第一个事务再次读取该范围的记录时,
    会发现有些原本不存在的记录,这就是幻读。
    举例来说,假设我们有一个存储学生信息的表,有一个事务A要查询年龄在10-20之间的学
    生,它在查询前会对这个区间加锁。此时如果有另一个事务B想要插入一个年龄为15的学生,
    由于这个年龄的范围已经被事务A锁定,所以事务B必须等待,直到事务A完成,释放锁。这
    样就避免了幻读的产生。
    值得注意的是,由于间隙锁会锁定范围,如果并发事务较多且涉及的数据范围有交集,可能
    会引发性能问题,甚至死锁。因此,在设计数据库和选择隔离级别时,需要综合考虑数据一
    致性和并发性能。

间隙锁有哪些使用场景

间隙锁(Gap Locks)在MySQL数据库的InnoDB存储引擎中主要用于以下场景:

  1. 防止幻读:间隙锁的主要目的是防止其他事务在已经锁定的范围内插入新的行。这可以避
    免"幻读"问题,即一个事务在读取某个范围内的所有行时,另一个事务插入了一个新行,
    当第一个事务再次读取该范围时,会发现有一个"幻影"行。
  2. 范围查询:在执行范围查询时,如果事务需要对查询结果进行更新或删除,那么间隙锁可
    以保证在事务执行期间,不会有新的行插入到查询范围中。
    例如,以下事务会在Orders表的OrderID列值在1到100之间的所有行上设置排他锁,并在这
    些行的间隙上设置间隙锁:
START TRANSACTION;
SELECT * FROM Orders WHERE OrderID BETWEEN 1 AND 100 FOR UPDATE;
COMMIT;
  1. 防止死锁:在某些情况下,间隙锁可以帮助防止死锁。如果没有间隙锁,那么两个事务可
    能都会试图在同一位置插入一个新行,导致彼此等待对方释放锁,从而形成死锁。
    需要注意的是,间隙锁在可重复读(REPEATABLE READ)和序列化(SERIALIZABLE)这两
    个隔离级别下才会使用,在读已提交(READ COMMITTED)和读未提交(READ
    UNCOMMITTED)这两个隔离级别下,InnoDB不会使用间隙锁。

在这里插入图片描述
在这里插入图片描述
可以看到将5–11这些数据都锁住了,这种情况下其它的事务想要去在这个1到11的id区间内做数据修改是会被阻塞的,知道我们将事务提交或者回滚将锁释放才行
在这里插入图片描述
在这里插入图片描述

三、临建锁(Next-Key Lock)

Next-Key 可以理解为一种特殊的间隙锁,也可以理解为一种特殊的算法。通过临建锁可以解决幻读的问题。 每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的一点是,InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、表锁

意向锁(Intention Lock)

意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。

作用

意向锁的作用是告诉其他事务,当前事务要获取某个页的行锁,以避免其他事务误判并尝试获取该页的表锁。意向锁的引入可以提高并发性能,减少锁冲突。

为什么意向锁是表级锁呢?

当我们需要加一个排他锁时,需要根据意向锁去判断表中有没有数据行被锁定(行锁);
(1)如果意向锁是行锁,则需要遍历每一行数据去确认;
(2)如果意向锁是表锁,则只需要判断一次即可知道有没数据行被锁定,提升性能。

意向锁怎么支持表锁和行锁并存?

(1)首先明确并存的概念是指数据库同时支持表、行锁,而不是任何情况都支持一个表中同
时有一个事务A持有行锁、又有一个事务B持有表锁,因为表一旦被上了一个表级的写锁,肯
定不能再上一个行级的锁。
(2)如果事务A对某一行上锁,其他事务就不可能修改这一行。这与“事务B锁住整个表就
能修改表中的任意一行”形成了冲突。所以,没有意向锁的时候,让行锁与表锁共存,就会
带来很多问题。于是有了意向锁的出现,如前面所言,数据库不需要在检查每一行数据是否
有锁,而是直接判断一次意向锁是否存在即可,能提升很多性能。

在这里插入图片描述

如何查看

当我执行行锁的时候会为这个表添加一个意向锁,这个意向锁是什么类型取决于你为行锁添加的是什么类型
在这里插入图片描述
我这里是要给意向排他锁,是因为我行锁用的是排他锁。

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

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

相关文章

【Spring 篇】MyBatis多表操作:编织数据的交响乐

欢迎来到MyBatis的多表操作世界!在这个充满交响乐的舞台上,我们将探索如何巧妙地编织多个数据表的数据,创造出一场旋律动听的数据交响曲。无需繁琐的SQL拼接,MyBatis让多表操作变得优雅而简单。让我们一起进入这个音乐殿堂&#x…

全卷积网络:革新图像分析

一、介绍 全卷积网络(FCN)的出现标志着计算机视觉领域的一个重要里程碑,特别是在涉及图像分析的任务中。本文深入探讨了 FCN 的概念、它们的架构、它们与传统卷积神经网络 (CNN) 的区别以及它们在各个领域的应用。 就像…

DualSPHysics源码结构解读,新手入门

DualSPHysics代码下载,进入官网:https://dual.sphysics.org/ 可以看到下载的地方有①Full package ②Source code,官方的解读是:如果你只是想运行案例的话就下载Full package,如果想要自己进行修改构建的话&#xff0…

【modelsim使用】数据显示设置

本文介绍modelsim使用中数据的显示设置,定点小数的显示、模拟波形的显示、数据截位查看、信号颜色和行高设置的操作。 文章目录 定点小数显示模拟波形的显示选取信号的某几位组合查看信号颜色与行高设置 定点小数显示 使用modelsim进行仿真时,涉及到定点…

ICSpector:一款功能强大的微软开源工业PLC安全取证框架

关于ICSpector ICSpector是一款功能强大的开源工业PLC安全取证框架,该工具由微软的研究人员负责开发和维护,可以帮助广大研究人员轻松分析工业PLC元数据和项目文件。 ICSpector提供了方便的方式来扫描PLC并识别ICS环境中的可疑痕迹,可以用于…

PHP - Yii2 异步队列

1. 前言使用场景 在 PHP Yii2 中,队列是一种特殊的数据结构,用于处理和管理后台任务。队列允许我们将耗时的任务(如发送电子邮件、push通知等)放入队列中,然后在后台异步执行。这样可以避免在处理大量请求时阻塞主应用…

HTML-表格

表格 1.基本结构 一个完整的表格由:表格标题、表格头部、表格主体、表格脚注,四部分组成 表格涉及到的标签: table:表格 caption:标题 thead:表格头部 tbody:表格主体 tfoot:表格注…

精酿啤酒的原料供应链:质量控制的重要性

对于啤酒的品质和口感,原料供应链的质量控制是重要的。特别是对于Fendi Club这样品质的啤酒,其原料供应链的管理更是重中之重。下面,我们将深入探讨Fendi Club啤酒如何对其原料供应链进行质量控制,以确保啤酒的品质和口感。 首先&…

Matlab|含风电-光伏-光热电站电力系统N-k安全优化调度模型

目录 1 主要内容 程序算例 程序模型 程序亮点 2 部分程序 3 部分结果 4 下载链接 1 主要内容 该程序参考《光热电站促进风电消纳的电力系统优化调度》光热电站模型,主要做的是考虑N-k安全约束的含义风电-光伏-光热电站的电力系统优化调度模型,从而…

OllyDbg动态调试检测方案

据游戏工委数据统计,2023年国内客户端游戏市场实际销售收入达662.83亿元,同比增长8%。PC端游戏实际收入已连续4年实现增长,主要得益于现有的游戏收入持续增长以及更多新品在PC端同步发行等因素。 2023 PC端游戏市场实际销售收入 随着PC端游戏…

【JS】事件汇总(方便查找)

文章目录 一、鼠标事件二、键盘事件2.1、按下键盘键(keydown)2.2、抬起键盘键(keyup)2.3、按下有效键(keypress)2.4、常见键盘码(了解) 三、焦点事件3.1、聚焦(focus&…

LC每日一题 2024/1/25 2859. 计算 K 置位下标对应元素的和

目录 题干 思路 代码 题干 思路 简单的位运算,就是寻找这个数对应的二进制中的1的个数是否与k相同,如果相同,就把这个数加到结果当中 可能涉及到的方法:Integer.bitCount() -->计算出二进制中包含的1的个数 代码 调用Java…

AI新工具(20240124) ComfyUI-InstantID-ComfyUI下的非官方InstantID实现;Lumiere是由谷歌时空扩散模型

ComfyUI-InstantID-ComfyUI下的非官方InstantID实现 ComfyUI InstantID是对InstantID的非官方实现,支持本地和huggingface hub模型,同时支持通用styler。它包括基础模型加载、InsightFace模型加载、ID ControlNet模型加载、Ipadapter_instantid模型加载…

银行数据仓库体系实践(6)--调度系统

调度系统是数据仓库的重要组成部分,也是每个银行或公司一个基础软件或服务,需要在全行或全公司层面进行规划,在全行层面统一调度工具和规范,由于数据类系统调度作业较多,交易类系统批量优先级高,为不互相影…

【算法分析与设计】二叉树的层序遍历

📝个人主页:五敷有你 🔥系列专栏:算法分析与设计 ⛺️稳中求进,晒太阳 题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点&#xf…

互联网泛人才流动报告:大厂扩张按下暂停键,这家公司逆势给出5w月薪招人

前段时间,脉脉高聘人才智库发布了《2023年互联网泛人才流动报告》,似乎佐证了23年是互联网真正的寒冬…… 卷生卷死!5个人竞争2个岗位 2023年,互联网行业的求职难度可以说是地狱级别,人才供需比持续上升,…

【vue】Vue2和Vue3中的代码逻辑复用对比(mixins、自定义hook):

文章目录 一、前言:二、mixins:【1】mixins是什么?【2】mixins如何使用?【3】mixins的一些特性:【4】mixins的缺点: 三、hook:【1】Vue3.x中的自定义hook函数是什么?【2】mixins和Co…

log4j2配置文件命名及优先级

log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",“.json"或者”.jsn"。 命名规则 默认配置文件名: log4j2.xml 或 log4j2.json 测试或特定环境配置文件名:可以以 -t…

无人机航迹规划(七):五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、五种算法(DBO、LO、SWO、COA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启…

小程序样例3:根据日历创建待办事项

基本功能 1、待办事项查看 选择不同的日期显示不同的待办: 2、选择日期后 新增事项: 3. 点击事项,查看详情 4、删除事项:删除事项3之后,剩余事项2 5、点击日期可以选择更多的月: 实现思路: 1、数据结构&a…