【mysql】锁机制 - 2.行锁间隙锁临键锁
目录1. 锁的几种类型1.1 记录锁行锁?Record Lock1.2?间隙锁 Gap Lock1.3 临键锁?Next-Key Lock2. 加锁过程2.1 唯一索引的查询(1) 等值查询, 查询记录存在(2)?等值查询, 查询记录不存在(3) 范围查询2.2 普通索引的查询(1) 等值查询, 查询记录存在(2) 等值查询, 查询记录不存在(3) 范围查询2.3 其他查询2.4 总结1. 锁的几种类型对 InnoDB 按照锁粒度可以分为行锁、间隙锁、临键锁、意向锁1.1 记录锁行锁Record Lock即锁住一条记录。 一般在使用主键或者唯一索引进行查找时体现。分为两种模式共享和独占即 S 共享锁、X 排他锁行锁依附于索引而存在也就是说行锁是在加索引上而不是行上的InnoDB 使用的是聚簇索引因此行锁最终都会落到聚簇索引上比如select * from table1 where id5 for update; ? ? ? ? ?-- 会在 id5 的索引记录上加 X 锁 select * from table1 where id5 lock in share mode;??-- 会在 id5 的索引记录上加 S 锁 select * from table1 where id5; ??? ??? ??? ??? ?? ?-- 不会加任何锁1.2间隙锁Gap Lock即对行记录之间的间隙加锁。 通常在不使用唯一索引进行范围查找时出现。间隙锁没有共享和排他的概念其目的是防止其他事务的 insert 操作规避幻读问题锁定的是一个区间左开右开如 index ∈ (10,20)间隙锁也是依附于索引而存在比如-- 表数据有 id 1,3,5 select * from table1 where id3 and id5 for update; ?-- 会锁住 (3,5) 范围, 防止插入41.3 临键锁Next-Key Lock是间隙锁 右边界的行锁。锁定的是一个区间左开右闭如 index ∈ (10,20]比如一个索引包含值 10, 15, 20, 那有临键锁(-oo, 10] (10, 15](15, 20](20, oo)比如-- 表数据有 id 1,3,5 select * from table1 where id3 and id5 for update; ?-- 会锁住 (3,5] 范围2. 加锁过程加锁的基本单位是临键锁。无论什么情况下 InnoDB 会往前扫描到第一个不满足条件的行为止。2.1 唯一索引的查询比如有以下表结构ida101203(1) 等值查询, 查询记录存在当查询记录存在在用「唯一索引进行等值查询」时临键锁会退化成「行锁」select * from table1 where id 20 for update;加锁过程加锁的基本单位是临键锁因此加锁范围在 (10, 20]值存在所以退化成行锁即对 id 20 加锁(2)等值查询, 查询记录不存在当查询记录不存在在用「唯一索引进行等值查询」时临键锁会退化成「间隙锁」select * from table1 where id 15 for update; insert into table1 set (id) values (11);加锁过程加锁的基本单位是临键锁因此加锁范围在 (10, 20]值不存在所以退化成间隙锁即锁住 (10, 20)此时的 insert 操作会阻塞因为 11 在 (10, 20) 范围内已经被锁住了(3) 范围查询select * from table1 where id 10 and id 11 for update; insert into table1 set (id) values (15);加锁过程对 id10 条件, 会对 id10 这一条记录加行锁由于是范围查询会继续向后查找到 id20, 加锁范围在 (10, 20]再退化成间隙锁 (10, 20)因此最终锁住的是 id10 和 (10, 20)此时的 insert 操作会阻塞因为 15 在 (10, 20) 范围内已经被锁住了2.2 普通索引的查询比如有以下表结构ida非唯一索引101203305(1) 等值查询, 查询记录存在当查询记录存在对非主键索引会加「 临键锁」和「 间隙锁」 两把锁锁不会有退化行为并对主键索引加「行 锁」select * from table1 where a 3 for update; insert into table1 set (a) values (4);加锁过程加锁的基本单位是临键锁因此加锁范围在 a ∈ (1, 3]但不会退化为行锁对 a3 对应的主键 id20 加行锁由于是非唯一索引且查询记录存在所以还会加上间隙锁 规则是向下遍历到第一个不符合条件的值才能停止因此间隙锁的范围是 (3, 5)因此最终锁住的是非主键索引 a∈ (1, 3] 和 (3, 5) 和主键索引 id 20此时的 insert 操作会阻塞因为 4 在 (3, 5) 范围内已经被锁住了(2) 等值查询, 查询记录不存在当查询记录不存在对非主键索引加「 临键锁」 然后会退化为「 间隙锁」对主键索引不加锁select * from table1 where a 2 for update; insert into table1 set (a) values (4);加锁过程加锁的基本单位是临键锁因此加锁范围在 a ∈ (1, 3]由于是非唯一索引且查询记录不存在所以临键锁退化为间隙锁即 (1, 3)因此最终锁住的是非主键索引 a∈ (1, 3)对主键索引不会加锁此时的 insert 操作正常执行不会阻塞。(3) 范围查询select * from table1 where a 3 and a 4 for update; insert into table1 set (a) values (5);加锁过程对条件 a3会先加临键锁 (1, 3]但不会退化为行锁对 a3 对应的主键 id20 加行锁对向下的一条主键 id30 加行锁继续向后查找直到 a 5加临键锁 (3,5]但不会退化为间隙锁因此最终锁住的是非主键索引 a∈ (1, 3](3, 5] 和主键索引 id20, 30此时的 insert 操作会阻塞因为 5已经被锁住了2.3 其他查询没有索引的查询会导致全表扫描对每一个索引加临键锁相当于锁住整个表。Delete语句和 select for update / update 语句没有差异因为 mysql 的 delete 是软删除先在记录上打一个删除标记再通过后台的 purge 线程来清理所以 delete 操作的加锁过程和基本查询是一样的。2.4 总结查询规则唯一索引等值查询当查询的记录存在 临键锁 会退化成行锁当查询的记录不存在临键锁会退化成间隙锁非唯一索引等值查询当查询的记录存在会加 临键锁和 间隙锁两把锁当查询的记录不存在只会加 临键锁然后退化为间隙锁非唯一索引和主键索引的范围查询的区别唯一索引在满足条件时 临键锁 退化为间隙锁和记录锁非唯一索引范围查询 临键锁不会退化 为间隙锁和记录锁在使用时要注意在执行 update / delete / select for update 语句时一定要检查语句是否走了索引避免全表扫描Delete 时尽量使用主键 ID唯一索引 删除查询时尽量使用唯一索引进行查询锁定范围较小参考MySQL记录锁、间隙锁、临键锁Next-Key Locks加锁过程 - caibaotimes - 博客园MySQL记录锁、间隙锁、临键锁 - DiligentCoder - 博客园

相关新闻

【2026年滴滴春招-3月8日-第二题(100分)- 不等式问题】(题目+思路+JavaC++Python解析+在线测试)

【2026年滴滴春招-3月8日-第二题(100分)- 不等式问题】(题目+思路+JavaC++Python解析+在线测试)

题目内容 小QQQ的老师给了他一道不等式则目,但是他不会做,于是他跑来向你求助。 给定两个整数nnn和xx

2026/7/5 14:00:38 阅读更多 →
08c. 检索算法与策略-混合检索

08c. 检索算法与策略-混合检索

08c. 检索算法与策略-混合检索 1. 概述 📚 我们将学习混合检索技术的核心原理和实践方法,掌握稀疏检索与稠密检索的融合策略,了解RRF等结果融合算法,为RAG系统构建兼顾精确匹配和语义理解的高效检索能力 🎯。 通过前…

2026/7/5 21:05:55 阅读更多 →
【Mysql】:如何配置最大连接数?

【Mysql】:如何配置最大连接数?

MySQL 数据库的 max_connections 参数用于控制服务器允许的最大并发连接数。增加这个值可以允许更多的客户端同时连接到数据库,但是需要注意的是,每个连接都会消耗一定的内存和其他资源,因此不能无限制地增加该值。 如何查看当前的最大连接数…

2026/5/17 10:24:47 阅读更多 →

最新新闻

C语言指针:指针类型、void*指针、const修饰及传址调用

C语言指针:指针类型、void*指针、const修饰及传址调用

文章目录一、指针类型的意义1. 指针的解引用2.指针的运算(1) 指针-整数(2) 指针-指针(3) 指针的关系运算二、void*类型的指针三、const修饰的指针1.const修饰变量2.const修饰指针变量四、指针在函数中的使用1.函数的传值调用2.函数的传址调用一、指针类型的意义 ● 既然指针变…

2026/7/5 21:20:34 阅读更多 →
如何用Containerlab快速搭建企业级网络实验室:容器化网络测试的终极指南

如何用Containerlab快速搭建企业级网络实验室:容器化网络测试的终极指南

如何用Containerlab快速搭建企业级网络实验室:容器化网络测试的终极指南 【免费下载链接】containerlab container-based networking labs 项目地址: https://gitcode.com/gh_mirrors/co/containerlab 还在为搭建网络测试环境而头疼吗?传统方式需…

2026/7/5 21:18:33 阅读更多 →
Primer设计系统架构现代化升级策略:从技术债务清理到性能收益的完整迁移路线图

Primer设计系统架构现代化升级策略:从技术债务清理到性能收益的完整迁移路线图

Primer设计系统架构现代化升级策略:从技术债务清理到性能收益的完整迁移路线图 【免费下载链接】design Primer Design Guidelines 项目地址: https://gitcode.com/gh_mirrors/des/design 面对日益复杂的UI组件生态系统,Primer设计系统的版本升级…

2026/7/5 21:18:33 阅读更多 →
Vite 依赖预构建:开发启动快,也要看缓存失效

Vite 依赖预构建:开发启动快,也要看缓存失效

Vite 依赖预构建:开发启动快,也要看缓存失效 一、预构建解决的是依赖成本 Vite 开发环境启动快,很大一部分来自依赖预构建。它会把 CommonJS 或复杂依赖转换成更适合浏览器加载的 ESM,并缓存起来。平时它很安静,但一旦…

2026/7/5 21:16:33 阅读更多 →
ECC-算法原理

ECC-算法原理

1、ECC介绍 ECC,Error Checking and Correcting,是用于内存存储的数据不稳定时,发生错误时可以进行检查和纠正,ECC是基于奇偶校验的原理,多用于FLASH和SRAM中。 1.1 纠一检二(SEC-DED) &#xf…

2026/7/5 21:12:32 阅读更多 →
Trilogy高级特性:连接池管理与异步查询实现指南

Trilogy高级特性:连接池管理与异步查询实现指南

Trilogy高级特性:连接池管理与异步查询实现指南 【免费下载链接】trilogy Trilogy is a client library for MySQL-compatible database servers, designed for performance, flexibility, and ease of embedding. 项目地址: https://gitcode.com/gh_mirrors/tr/t…

2026/7/5 21:08:31 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻