最新要闻
- 宝能造车梦破碎:烧了80多亿元的观致 如今沦为法拍车
- 女孩4万多元的摩托 被男摩友加白糖报废!官方介入
- 全球即时:柔软顺滑 古今男士平角裤3条到手29.9元
- 世界视讯!休闲百搭 361° 运动束脚裤立减140元:49元起清仓价
- 环球速看:冰火两重天!四川一地昼夜温差38.6℃ 专家揭秘真相
- 今年开播有戏 “陈萍萍”演员吴刚回应《庆余年》第二季:很快了
- 奔驰被曝大砍产品线!19款车型或将淘汰 原因现实
- 环球视点!马斯克收费比微博狠多了:推特被曝企业“金V”认证付费:每月6770元
- 焦点热议:3年前旗舰也有份!中国广电剧透:小米10/青春版计划4月推送MIUI 14
- 《流浪地球2》票房破32亿元 导演谈第3部:原班人马再来一遍
- 全球最资讯丨浙江台州最大汽车经销商老板跑路 旗下19家4S店全部关停
- 12.4万保时捷首单买家发声:保时捷答应优惠卖车
- 当前速递!父亲借女儿3万压岁钱不还被起诉 法院:应还本金及利息
- 焦点观察:1万元!佳能入门级全画幅相机EOS R8规格曝光
- 世界微速讯:为S23让路!三星Galaxy S22京东秒杀:骁龙8小屏旗舰 3569元
- 环球微头条丨豆瓣8.1分!《三体》主创:能拍中国科幻大作 此生无憾
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
美团索命一问:一个SQL ,怎么分析加了哪些锁? 含4大场景、8个规则
背景说明:
美团问数据库应该是非常多的,尤其喜欢考手写 SQL 然后问你这个 SQL 语句上面加了哪些锁,
(相关资料图)
你会发现其他厂面试基本很少会这样考,所以很多小伙伴遇到这种问题的时候都是一脸懵逼,
可以说是“夺命一问”
此文,40岁老架构师尼恩,用自己的深厚内功,为大家梳理了 加锁的四大场景、八大规则,
把这个 “夺命一问”, 彻底攻克。
现在把这个 题目以及参考答案,收入咱们的 《尼恩Java面试宝典》,
供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
注:本文以 PDF 持续更新,最新尼恩 架构笔记、面试题 的PDF文件,请从这里获取:码云
加锁的场景分析
- 场景1:唯一索引等值查询
- 场景1.1、查询的记录存在
- 场景1.2、查询的记录不存在
- 场景 2:唯一索引范围查询
- 场景 3:非唯一索引等值查询
- 场景3.1、查询的记录存在
- 场景3.2、查询的记录不存在
- 场景 4:非唯一索引范围查询
接下来,按照以上4大场景,进行 sql 加锁的分析。
回顾一下,InnoDB 三种行锁:
- Record Lock(记录锁):锁住某一行记录
- Gap Lock(间隙锁):锁住一段左开右开的区间
- Next-key Lock(临键锁):锁住一段左开右闭的区间
哪些语句上面会加行锁?
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
的记录。
注意,查找并不是从第一行开始一行一行地进行遍历,而是根据 B+ 树的特性进行二分查找,所以一般存储引擎只会访问到要找的记录行(id = 7
)的相邻区间
规则2:加锁的基本单位是 Next-key Lock (临键锁):锁住一段左开右闭的区间
实例分析
下面结合实例, 分析一条 SQL 语句上面究竟被 InnoDB 自动加上了多少个锁
假设有这么一张 user
表:
id
为主键(唯一索引),a
是普通索引(非唯一索引),b
都是普通的列,b上没有任何索引:
id (唯一索引) | a (非唯一索引) | b |
---|---|---|
10 | 4 | Alice |
15 | 8 | Bob |
20 | 16 | Cilly |
25 | 32 | Druid |
30 | 64 | Erik |
场景1:唯一索引等值查询
当我们用唯一索引进行等值查询的时候,根据查询的记录是否存在,加锁的规则会有所不同:
规则3:当查询的记录是存在的,Next-key Lock 临键锁 会退化成 Record Lock 记录锁
规则4:当查询的记录是不存在的,Next-key Lock 临键锁 会退化 Gap Lock 成间隙锁
场景1.1、查询的记录存在
先来看个查询的记录存在的案例:
select * from user where id = 25 for update;
结合加锁的规则1、规则2:
规则1:查找过程中访问到的对象才会加锁
规则2:加锁的基本单位是 Next-key Lock 临键锁(左开右闭)
两条要点, 我们可以分析出,这条语句的加锁范围是 临键锁(20, 25]
不过,按照规则3,由于这个唯一索引等值查询的记录 id = 25
是存在的,因此,Next-key Lock 临键锁 会退化成 Record Lock 记录锁,因此最终的加锁范围是 id = 25
这一行
场景1.2、查询的记录不存在
再来看查询的记录不存在的案例:
select * from user where id = 22 for update;
结合加锁的两条要点(重复一下,表示强调):
规则1:查找过程中访问到的对象才会加锁
规则2:加锁的基本单位是 Next-key Lock 临键锁(左开右闭)
我们可以分析出,这条语句的加锁范围是 (20, 25]
这里为什么是 (20,25]
而不是 (20, 22]
?
因为 id = 22 的记录不存在呀,InnoDB 先找到 id = 20 的记录,发现不匹配,于是继续往下找,发现 id = 25,因此,id = 25 的这一行被扫描到了,所以整体的加锁范围是 (20, 25]
不过,按照规则4,由于这个唯一索引等值查询的记录 id = 22
是不存在的,因此,Next-key Lock 会退化成间隙锁,因此最终在主键 id 上的加锁范围是 Gap Lock (20, 25)
场景 2:唯一索引范围查询
唯一索引范围查询的规则和等值查询的规则一样,
规则3:当查询的记录是存在的,Next-key Lock 会退化成记录锁
规则4:当查询的记录是不存在的,Next-key Lock 会退化成间隙锁
只有一个区别,就是唯一索引的范围查询,需要一直向右遍历到第一个不满足条件的记录,相当于增加了一条规则:
规则5:唯一索引的范围查询,一直向右遍历到第一个不满足条件的记录
下面结合案例来分析:
select * from user where id >= 20 and id < 22 for update;
id (唯一索引) | a (非唯一索引) | b |
---|---|---|
10 | 4 | Alice |
15 | 8 | Bob |
20 | 16 | Cilly |
25 | 32 | Druid |
30 | 64 | Erik |
先来看语句查询条件的前半部分 id >= 20
,
结合加锁的规则1、规则2:
规则1:查找过程中访问到的对象才会加锁
规则2:加锁的基本单位是 Next-key Lock 临键锁(左开右闭)
这条语句最开始要找的第一行是 id = 20,需要加上 Next-key Lock (15,20]
。
根据规则3、规则4:
又由于 id 是唯一索引,且 id = 20 的这行记录是存在的,因此会退化成记录锁,也就是只会对 id = 20
这一行加锁。
根据规则5:
再来看语句查询条件的后半部分 id < 22
,由于是范围查找,就会继续往后找第一个不满足条件的记录,也就是会找到 id = 25
这一行停下来,然后加 Next-key Lock 临界锁(20, 25]
,
根据规则4:
重点来了,但由于 id = 25
不满足 id < 22
,因此会退化成间隙锁,加锁范围变为 (20, 25)
。
所以,上述语句在主键 id 上的最终的加锁范围是 Record Lock id = 20
以及 Gap Lock (20, 25)
场景 3:非唯一索引等值查询
当我们用非唯一索引进行等值查询的时候,根据查询的记录是否存在,加锁的规则会有所不同:
规则6:当查询的记录是存在的,除了会加 Next-key Lock 外,还会额外加间隙锁(规则是向下遍历到第一个不符合条件的值才能停止),也就是会加两把锁
很好记忆,就是要查找记录的左区间加 Next-key Lock 锁住一段左开右闭的区间,右区间加 Gap lock 锁住一段左开右开的区间
规则7:当查询的记录是不存在的,Next-key Lock 会退化成 Gap lock 间隙锁(这个规则和唯一索引的等值查询是一样的)
场景3.1、查询的记录存在
先来看个查询的记录存在的案例:
select * from user where a = 16 for update;
结合加锁的规则1、规则2:
规则1:查找过程中访问到的对象才会加锁
规则2:加锁的基本单位是 Next-key Lock 临键锁(左开右闭)
这条语句首先会对普通索引 a 加上 Next-key Lock,范围是 (8,16]
根据规则6,又因为是非唯一索引等值查询,且查询的记录 a= 16
是存在的,所以还会加上间隙锁,规则是向下遍历到第一个不符合条件的值才能停止,因此间隙锁的范围是 (16,32)
所以,上述语句在普通索引 a 上的最终加锁范围是 Next-key Lock (8,16]
以及 Gap Lock (16,32)
场景3.2、查询的记录不存在
再来看查询的记录不存在的案例:
select * from user where a = 18 for update;
结合加锁的两条核心,这条语句首先会对普通索引 a 加上 Next-key Lock,范围是 (16,32]
但是由于查询的记录 a = 18
是不存在的,因此 Next-key Lock 会退化为间隙锁,即最终在普通索引 a 上的加锁范围是 (16,32)
。
场景 4:非唯一索引范围查询
回顾一下,唯一索引范围查询,其查询的规则和唯一索引等值查询的规则一样,
规则3:当查询的记录是存在的,Next-key Lock 会退化成记录锁
规则4:当查询的记录是不存在的,Next-key Lock 会退化成间隙锁
规则5:唯一索引的范围查询,一直向右遍历到第一个不满足条件的记录
非唯一索引的范围查询和唯一索引范围查询不同的是,
规则8:非唯一索引的范围查询并不会退化成 Record Lock 或者 Gap Lock。
select * from user where a >= 16 and a < 18 for update;
先来看语句查询条件的前半部分 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]
。
推荐阅读:
《网易二面:CPU狂飙900%,该怎么处理?》
《阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了》
《峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?》
《场景题:假设10W人突访,你的系统如何做到不 雪崩?》
《2个大厂 100亿级 超大流量 红包 架构方案》
《Nginx面试题(史上最全 + 持续更新)》
《K8S面试题(史上最全 + 持续更新)》
《操作系统面试题(史上最全、持续更新)》
《Docker面试题(史上最全 + 持续更新)》
《Springcloud gateway 底层原理、核心实战 (史上最全)》
《Flux、Mono、Reactor 实战(史上最全)》
《sentinel (史上最全)》
《Nacos (史上最全)》
《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》
《clickhouse 超底层原理 + 高可用实操 (史上最全)》
《nacos高可用(图解+秒懂+史上最全)》
《队列之王: Disruptor 原理、架构、源码 一文穿透》
《环形队列、 条带环形队列 Striped-RingBuffer (史上最全)》
《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》
《红黑树( 图解 + 秒懂 + 史上最全)》
《分布式事务 (秒懂)》
《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》
《缓存之王:Caffeine 的使用(史上最全)》
《Docker原理(图解+秒懂+史上最全)》
《Redis分布式锁(图解 - 秒懂 - 史上最全)》
《Zookeeper 分布式锁 - 图解 - 秒懂》
《Zookeeper Curator 事件监听 - 10分钟看懂》
《Netty 粘包 拆包 | 史上最全解读》
《Netty 100万级高并发服务器配置》
美团索命一问:一个SQL ,怎么分析加了哪些锁? 含4大场景、8个规则
宝能造车梦破碎:烧了80多亿元的观致 如今沦为法拍车
女孩4万多元的摩托 被男摩友加白糖报废!官方介入
读Java实战(第二版)笔记01_Java的变化
全球即时:柔软顺滑 古今男士平角裤3条到手29.9元
世界视讯!休闲百搭 361° 运动束脚裤立减140元:49元起清仓价
环球速看:冰火两重天!四川一地昼夜温差38.6℃ 专家揭秘真相
今年开播有戏 “陈萍萍”演员吴刚回应《庆余年》第二季:很快了
python的基础知识1
奔驰被曝大砍产品线!19款车型或将淘汰 原因现实
环球视点!马斯克收费比微博狠多了:推特被曝企业“金V”认证付费:每月6770元
焦点热议:3年前旗舰也有份!中国广电剧透:小米10/青春版计划4月推送MIUI 14
《流浪地球2》票房破32亿元 导演谈第3部:原班人马再来一遍
全球最资讯丨浙江台州最大汽车经销商老板跑路 旗下19家4S店全部关停
12.4万保时捷首单买家发声:保时捷答应优惠卖车
[数据结构] 树、森林的遍历
每日时讯!MAUI新生2.5-数据绑定和MVVM:MVVM的属性验证
当前速递!父亲借女儿3万压岁钱不还被起诉 法院:应还本金及利息
焦点观察:1万元!佳能入门级全画幅相机EOS R8规格曝光
世界微速讯:为S23让路!三星Galaxy S22京东秒杀:骁龙8小屏旗舰 3569元
环球微头条丨豆瓣8.1分!《三体》主创:能拍中国科幻大作 此生无憾
低代码平台前端的设计与实现(三)设计态画布DesignCanvas的设计与实现
热资讯!重庆一景区煮麻辣汤圆:下次元宵佳节还得等384天
男子打包螺蛳粉开车24小时运回北京 只因朋友圈一句话:这是真爱
【天天新视野】用户滑雪频繁触发iPhone车祸检测功能 苹果:已进行了优化 同时派代表考察
天天快播:甜品级游戏本价格已曝光:搭载RTX 4050/4060
环球消息!5 组合数据类型
今日讯!短记我的二十五岁,如落叶般随风飘荡。
世界观焦点:java基础:流程控制
女子春节连打4通宵麻将:患上突发性耳聋
国产显卡搞定“显卡杀手”:摩尔线程MTT S80居然能跑《孤岛危机》
【世界独家】极限挤牙膏!三星Galaxy S23系列用残血版LPDDR5X内存
世界微动态丨wireshark 抓包整理———— 从一个小案例开始 [一]
【全球热闻】游客洪崖洞花30元找当地大爷抄近道 只花2分钟:网友道出真相
速讯:博纳影业总裁妻子金巧巧否认暗指《满江红》排片多、不好看:个人喜好
颜值最高的白色手机来了!vivo X90告白下周预售:天玑9200加持
天天消息!Python教程:IO
零下10度静止一夜不掉电!“车主”盛赞恒驰5 OTA效果好
当前视点!java基础:java基础语法
大众也不香了!比亚迪ATTO 3获德媒超高认可:钟爱刀片电池
快资讯:CPU性能提升10%!13代酷睿笔记本测试数据出炉
【全球报资讯】盖茨向马斯克“泼冷水”:殖民火星完全浪费钱
世界新资讯:医生发现19岁阿尔兹海默症患者:已知最年轻
SQL SERVER——高可用技术概述
环球微头条丨用ChatGPT写作业?新算法给AI生成文本加水印:置信度高达99.999999999994%
快播:【Redis场景拓展】秒杀问题-全局唯一ID生成策略
美团一面:InndoDB 单表最多 2000W,为什么?小伙伴竟然面挂
每日精选:2个月没人管!AMD老显卡终于要有新驱动了
奢侈品不愁卖!LV将涨价20% 世界首富放言:中国人有钱
全球看热讯:Andlua+实现WakeUpOnline远程开机
Docker搭建本地私有仓库
世界即时:vue/ts 新建项目时好用的配置 【vite.config.ts、tsconfig.json、】
天天热点!大爷看《狂飙》入戏屏幕前举杯痛饮 被演技折服:口碑大剧结尾你满意吗?
厉害!中国半导体领域科研论文数量持续全球第一 光触媒等已超美国
【缓存策略及实践】前端如何配置 HTTP 缓存机制
全球简讯:为什么感觉工资过万很普遍了?打打字就能月入过万你心动吗?央视揭秘新骗局
《生化危机4:重制版》第五章演示:里昂和碍事梨合作通关
云南小女孩骑鸵鸟上学从容淡定 挡眼睛控制方向:网友调侃是大象年检了
观焦点:造车新势力轿车月榜Top2 长安深蓝SL03迎开门红:1月交付6137台
环球快消息!越野车开进古河床随意碾压:改装牧马人无视警示牌“撒野” 专家:保护有难度
天天微资讯!2899元价格屠夫!XiaoMI Book 12.4 二合一评测:办公追剧不在话下
微头条丨C盘扩容:不要轻易转换动态磁盘 Dynamic Disk
乳腺癌已成为全球第一大癌症:我国每年新增42万 比国外发病早
今日观点!投资不过山海关对东北伤害狠!老工业基地全力发展新能源车 专家称沈阳可成深圳
世界今热点:全球首位!以色列总统使用ChatGPT写演讲稿:开头、结尾感受下
全球看热讯:《角斗士2》明年上映
全球热点评!阿里云盘致歉:昨晚系统故障 全平台无法加载内容
TGA年度最佳!《双人成行》销量破1000万:双人游戏天花板
环球今日报丨特斯拉降价到20万出头 网友忍不住要下单 宝马奔驰大众:我们不跟
速递!腾讯视频官宣:《三体》番外剧《三体:大史》即将上线
2023年1月随笔
世界今日报丨大跃进了!今年小米新机都将抛弃USB 2.0
今日立春:二十四节气之首 万物开始复苏
8个你可能不知道答案的常见JavaScript面试问题
世界热资讯!荣耀北斗卫星通信专利获批通过 荣耀Magic5系列将首发?
B站《三体》动画“晚节不保”:即将跌破4分
全球实时:再也不怕手一抖跳广告了!规范App乱跳转新标准出台
热门:坚挺四年的苹果:栽了
关注:你以为你真的会玩《俄罗斯方块》?看完这些大神 我大悟了
UI通过元素定位实现特定区域截图
全球热推荐:2022浙江高考数学导数压轴解析
每日速讯:春节开特斯拉出行的国内车主真不少!自驾万里的数以百计
微头条丨开年如何选购生产力整机!锐龙9 7950X vs i9-13900K对比测试:谁是更好的创作工具?
【全球聚看点】客人泡茶放近50根藏红花吓坏主人 真大补药:喝完身体并没有不适
四川公司回应招聘“下班到点跑的绕道”:本职工作完成不用加班
世界今亮点!MySQL数据类型补充
当前资讯!Python中的关键字的用法
每日热闻!在 FreeBSD 12 上安装 Gitea
女子身高185求职当老师被拒 用人单位:常弯腰工作很累
环球焦点!599元 戴尔上架新款透明机械键盘:定制轴体 全键热插拔
AMD Zen4笔记本登顶世界第一!31%优势碾压12代酷睿
环球最资讯丨ES6 简介(一)
【环球热闻】一汽车电梯故障 200多万的法拉利秒变“大事故车”
NVIDIA AD106、AD107小核心首次现身:“减肥”多达30%
全球今亮点!《狂飙》能“逆风翻盘” 一半功劳都是热搜的
全球微速讯:宠托师职业受青睐!上门喂宠物 几天收入数千元
环球微速讯:不用羡慕代驾小哥了!绿源新品TCR开售:整车超轻能跑120km
100%纯果蔬汁:味全每日C果汁5.5元/瓶抄底
私家车定速巡航失灵!时速120狂飙半小时:万幸平安无事
全球快报:《三体》主演于和伟:我本身就是科幻迷!