您的当前位置:首页 >系统运维 >美团面试特有:写个 SQL 语句然后问加了哪些锁 正文
时间:2025-11-05 13:53:52 来源:网络整理编辑:系统运维
美团问数据库应该是非常多的,尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁,你会发现其他厂面试基本很少会这样考,所以很多小伙伴遇到这种问题的时候都是一脸懵逼,这篇文章就来详细总结下
美团问数据库应该是美团面试非常多的,尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁,句然加锁你会发现其他厂面试基本很少会这样考,后问所以很多小伙伴遇到这种问题的美团面试时候都是一脸懵逼,这篇文章就来详细总结下 InnoDB 存储引擎中的句然加锁行锁的加锁规则,并辅以实例解释。后问
首先众所周知,美团面试InnoDB 三种行锁:

哪些语句上面会加行锁?
1)对于常见的 DML 语句(如 UPDATE、DELETE 和 INSERT ),后问InnoDB 会自动给相应的美团面试记录行加写锁
2)默认情况下对于普通 SELECT 语句,InnoDB 不会加任何锁,句然加锁但是后问在 Serializable 隔离级别下会加行级读锁
上面两种是隐式锁定,InnoDB 也支持通过特定的美团面试语句进行显式锁定:
3)SELECT * FROM table_name WHERE ... FOR UPDATE,加行级写锁
4)SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE,句然加锁加行级读锁
前置知识就不过多介绍了,后问在学习具体行锁加锁规则之前,小伙伴们需要记住加锁规则的两条核心:
1)查找过程中访问到的对象才会加锁
这句话该怎么理解?比如有主键 id 为 1 2 3 4 5 ... 10 的10 条记录,我们要找到 id = 7 的IT技术网记录。注意,查找并不是从第一行开始一行一行地进行遍历,而是根据 B+ 树的特性进行二分查找,所以一般存储引擎只会访问到要找的记录行(id = 7)的相邻区间
2)加锁的基本单位是 Next-key Lock
下面结合实例帮助大伙分析一条 SQL 语句上面究竟被 InnoDB 自动加上了多少个锁
假设有这么一张 user 表,id 为主键(唯一索引),a 是普通索引(非唯一索引),b 都是普通的列,其上没有任何索引:
id (唯一索引)
a (非唯一索引)
b
10
4
Alice
15
8
Bob
20
16
Cilly
25
32
Druid
30
64
Erik
当我们用唯一索引进行等值查询的时候,根据查询的记录是否存在,加锁的规则会有所不同:
当查询的记录是存在的,Next-key Lock 会退化成记录锁当查询的记录是不存在的,Next-key Lock 会退化成间隙锁先来看个查询的记录存在的案例:
复制select * from user
where id = 25
for update;1.2.3.结合加锁的两条核心:查找过程中访问到的对象才会加锁 + 加锁的基本单位是 Next-key Lock(左开右闭),我们可以分析出,这条语句的加锁范围是 (20, 25]
不过,由于这个唯一索引等值查询的记录 id = 25 是存在的,因此,Next-key Lock 会退化成记录锁,因此最终的加锁范围是 id = 25 这一行
再来看查询的记录不存在的案例:
复制select * from user
where id = 22
for update;1.2.3.结合加锁的两条核心:查找过程中访问到的对象才会加锁 + 加锁的基本单位是 Next-key Lock(左开右闭),我们可以分析出,这条语句的加锁范围是 (20, 25]
这里为什么是 (20,25] 而不是源码下载 (20, 22],因为 id = 22 的记录不存在呀,InnoDB 先找到 id = 20 的记录,发现不匹配,于是继续往下找,发现 id = 25,因此,id = 25 的这一行被扫描到了,所以整体的加锁范围是 (20, 25]
由于这个唯一索引等值查询的记录 id = 22 是不存在的,因此,Next-key Lock 会退化成间隙锁,因此最终在主键 id 上的加锁范围是 Gap Lock (20, 25)
唯一索引范围查询的规则和等值查询的规则一样,只有一个区别,就是唯一索引的范围查询需要一直向右遍历到第一个不满足条件的记录,下面结合案例来分析:
复制select * from user
where id >= 20 and id < 22
for update;1.2.3.先来看语句查询条件的前半部分 id >= 20,因此,这条语句最开始要找的第一行是 id = 20,结合加锁的两个核心,需要加上 Next-key Lock (15,20]。又由于 id 是唯一索引,且 id = 20 的这行记录是存在的,因此会退化成记录锁,也就是只会对 id = 20 这一行加锁。
再来看语句查询条件的后半部分 id < 22,由于是范围查找,就会继续往后找第一个不满足条件的记录,也就是会找到 id = 25 这一行停下来,然后加 Next-key Lock (20, 25],重点来了,但由于 id = 25 不满足 id < 22,因此会退化成间隙锁,加锁范围变为 (20, 25)。
所以,上述语句在主键 id 上的最终的加锁范围是 Record Lock id = 20 以及 Gap Lock (20, 25)
当我们用非唯一索引进行等值查询的时候,根据查询的记录是否存在,加锁的规则会有所不同:
当查询的记录是存在的,除了会加 Next-key Lock 外,还会额外加间隙锁(规则是向下遍历到第一个不符合条件的值才能停止),也就是会加两把锁很好记忆,就是要查找记录的左区间加 Next-key Lock,右区间加 Gap lock
当查询的记录是不存在的,Next-key Lock 会退化成间隙锁(这个规则和唯一索引的等值查询是一样的)先来看个查询的记录存在的案例:
复制select * fromuser
where a = 16for update;1.2.3.结合加锁的两条核心,这条语句首先会对普通索引 a 加上 Next-key Lock,范围是 (8,16]
又因为是非唯一索引等值查询,且查询的记录 a= 16 是存在的,所以还会加上间隙锁,规则是向下遍历到第一个不符合条件的值才能停止,因此间隙锁的范围是 (16,32)
所以,上述语句在普通索引 a 上的最终加锁范围是 Next-key Lock (8,16] 以及 Gap Lock (16,32)
再来看查询的记录不存在的案例:
复制select * fromuser
where a = 18for update;1.2.3.结合加锁的两条核心,这条语句首先会对普通索引 a 加上 Next-key Lock,范围是 (16,32]
但是由于查询的记录 a = 18 是不存在的,因此 Next-key Lock 会退化为间隙锁,即最终在普通索引 a 上的加锁范围是 (16,32)。
范围查询和等值查询的区别在上面唯一索引章节已经介绍过了,就是范围查询需要一直向右遍历到第一个不满足条件的记录,和唯一索引范围查询不同的是,非唯一索引的范围查询并不会退化成 Record Lock 或者 Gap Lock。
复制select * fromuser
where a >= 16 and a < 18for update;1.2.3.先来看语句查询条件的前半部分 a >= 16,因此,这条语句最开始要找的第一行是 a = 16,结合加锁的两个核心,需要加上 Next-key Lock (8,16]。虽然非唯一索引 a = 16 的这行记录是存在的,但此时并不会像唯一索引那样退化成记录锁。
再来看语句查询条件的后半部分 a < 18,由于是范围查找,就会继续往后找第一个不满足条件的记录,也就是会找到 id = 32 这一行停下来,然后加 Next-key Lock (16, 32]。虽然 id = 32 不满足 id < 18,但此时并不会向唯一索引那样退化成间隙锁。
所以,上述语句在普通索引 a 上的最终的加锁范围是 Next-key Lock (8, 16] 和 (16, 32],也就是 (8, 32]。
Yota手机——一部独具特色的智能手机(深度评测Yota手机的功能与性能,解读其独特之处)2025-11-05 13:33
华硕W519L安装Win7教程(轻松学会华硕W519L安装Win7的步骤和要点)2025-11-05 13:24
《以大牛导航为例,探讨其质量如何?》(了解大牛导航的特点、功能及用户评价)2025-11-05 13:14
探索至强E5320的性能与功能(领先市场的处理器架构与卓越性能)2025-11-05 12:54
网上批发电脑配件的优势与挑战(淘宝批发电脑配件的注意事项)2025-11-05 12:39
Excel制作图表的详细步骤(从数据到可视化的全过程掌握)2025-11-05 12:35
快捷键设置(提升工作效率的关键)2025-11-05 12:29
如何修复无法识别的U盘(解决U盘无法被电脑识别的问题,轻松恢复数据)2025-11-05 12:27
电脑开不了机解决方法大全(快速解决电脑无法启动的常见问题,让你的电脑重新恢复正常使用)2025-11-05 12:14
免费PS修图软件推荐(为您揭秘多款免费的Photoshop修图工具)2025-11-05 12:12
探索罗技欧姆龙轴的优势与特点(全面解析罗技欧姆龙轴的设计与功能,为你选择游戏鼠标提供参考)2025-11-05 13:36
大师U盘装系统教程(一站式操作,轻松启动系统安装)2025-11-05 13:33
索尼配镜头的优势和特点(探索索尼配镜头的卓越性能和创新技术)2025-11-05 13:22
联想拯救者电脑超频教程——释放游戏性能的秘密(一步步教你如何将联想拯救者电脑提升至极限)2025-11-05 13:15
从安装版系统开始的简易教程(轻松掌握系统安装的步骤与技巧)2025-11-05 13:05
手机QQ自动回复的设置与使用技巧(掌握手机QQ自动回复,提升沟通效率)2025-11-05 13:02
如何更新电脑USB驱动(简易步骤教您更新电脑USB驱动)2025-11-05 12:40
电脑服务错误1068的解决方法(如何修复电脑服务错误1068以恢复正常运行)2025-11-05 11:53
探索Avexir8GB内存的性能与质量(解析Avexir8GB内存的关键特性与用户评价)2025-11-05 11:27