当前位置: 首页 > news >正文

面试官:谈谈 InnoDB 中的表级锁、页级锁、行级锁?

👉这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:

  • 《项目实战(视频)》:从书中学,往事中“练”

  • 《互联网高频面试题》:面朝简历学习,春暖花开

  • 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题

  • 《精进 Java 学习指南》:系统学习,互联网主流技术栈

  • 《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRMAI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本

  • 面试官到底在考什么

  • 三种锁粒度:一张表终结混乱

  • 行级锁:InnoDB 能扛住高并发的原因

  • 表级锁:意向锁才是你该讲的重点

  • 行锁升表锁:生产事故重灾区

  • 页级锁:一句话带过就行

  • 面试追问三连:答到这个程度就够了


这道题面试出现频率极高,但 90% 的人答得像背书——把三种锁的定义念一遍就完了。面试官想听的根本不是定义。

面试官到底在考什么

三个层次,一个比一个深:

  1. 基础认知:三种锁粒度的并发性和开销权衡——知道有哪些锁、各自什么场景用

  2. InnoDB 深度:行锁什么情况下会"意外"变成锁表——这是生产事故高发区,答出来说明你踩过坑

  3. 锁兼容性:S 锁和 X 锁的冲突矩阵,意向锁在多粒度锁定中的角色——说清楚意向锁,说明你真读过源码级资料

下面按这三层来讲。答面试时也建议按这个顺序展开——先给结论表格,再逐个深入。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

三种锁粒度:一张表终结混乱

锁类型

锁什么

并发能力

加锁代价

谁在用

行级锁

单行记录

最高

最大(内存开销)

InnoDB 默认

页级锁

一个 16KB 数据页

中等

中等

BDB(已废弃)

表级锁

整张表

最低

最小

MyISAM、DDL 操作

核心结论:InnoDB 选行级锁,牺牲锁管理开销换来高并发——这是它能撑住 OLTP 场景的根本原因。MyISAM 选表级锁,管理简单但并发度拉胯,所以只适合读多写少的场景。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

行级锁:InnoDB 能扛住高并发的原因

InnoDB 的行级锁不是只有一种,而是一套组合拳:

锁类型

干什么的

什么时候触发

Record Lock

记录锁

精确锁定一条索引记录

等值查询命中索引

Gap Lock

间隙锁

锁索引记录之间的"空隙"

RR 级别防幻读

Next-Key Lock

临键锁

记录锁 + 间隙锁

RR 级别默认加锁方式

S 锁

共享锁

允许别人读,不允许写

SELECT ... FOR SHARE
X 锁

排他锁

读写都不允许

FOR UPDATE

/ DML

S 和 X 的兼容矩阵

说人话:

  • 两个事务同时读同一行→ 没问题,S 锁兼容

  • 一个读一个写同一行→ 等着,S 和 X 冲突

  • 两个事务同时写同一行→ 必须排队,X 和 X 冲突

-- 共享锁:我读这行,别人也能读,但不能改 SELECT * FROM orders WHERE id = 1001 FOR SHARE; -- 排他锁:我要改这行,别人读写都得等 SELECT * FROM orders WHERE id = 1001 FOR UPDATE; -- DML 语句自动加 X 锁 UPDATE orders SET status = 'PAID' WHERE id = 1001;

Gap Lock 存在的意义:防止别的事务在你查询范围内插入新行(幻读)。只在 RR 隔离级别生效。如果你用 RC 级别,Gap Lock 不加,幻读你自己兜着。

表级锁:意向锁才是你该讲的重点

InnoDB 的表级锁里,面试真正要考的是意向锁——大部分人知道有这东西,但说不清它解决什么问题。

说明

怎么加的

IS

意向共享锁

"我要对某些行加 S 锁"

InnoDB 自动加

IX

意向排他锁

"我要对某些行加 X 锁"

InnoDB 自动加

表 S 锁

锁定整张表做读取

LOCK TABLES t READ
表 X 锁

锁定整张表做写入

LOCK TABLES t WRITE
MDL

元数据锁

保护表结构不被 DDL 改掉

DDL 自动加

意向锁到底解决什么问题

场景:事务 A 锁住了第 500 行(X 锁),事务 B 想对整张表加 S 锁。B 怎么知道表里有行正在被锁?难道遍历 100 万行逐一检查?

意向锁的方案:事务 A 加行锁之前,InnoDB 自动在表级别挂一个 IX 标记。B 想加表锁时,只需要看表上有没有意向锁,不需要逐行扫描。O(1) 判断。

关键细节:意向锁之间永远兼容(IS 和 IX 不冲突)——因为它们只是"声明意图",真正的冲突检测在行锁层面做。

行锁升表锁:生产事故重灾区

这是面试最爱挖的坑,也是线上出事最多的地方。

核心规则:InnoDB 的行锁是加在索引上的。如果你的 WHERE 条件没走索引(无索引字段、索引失效、类型隐式转换),InnoDB 执行全表扫描,每一行都会被加锁——效果等同于锁表。

-- ❌ 灾难:create_time 没索引,锁全表 -- 1000 万行的表,每行都被 X 锁锁住,其他事务全部等待 UPDATE orders SET status = 'CLOSED' WHERE create_time < '2024-01-01'; -- ✅ 正确做法:先用索引查出 id,再按主键精确更新 SELECT id FROM orders WHERE create_time < '2024-01-01' LIMIT 1000; UPDATE orders SET status = 'CLOSED' WHERE id IN (1, 2, 3, ...);

验证方法:用EXPLAIN看执行计划确认走没走索引;出事了用下面的 SQL 看锁等待:

-- MySQL 8.0+ 查看当前持有的锁 SELECT * FROM performance_schema.data_locks; -- 查看锁等待关系 SELECT * FROM performance_schema.data_lock_waits;

常见触发场景

  1. WHERE 字段没建索引

  2. 索引列发生隐式类型转换(WHERE phone = 13800138000,phone 是 varchar)

  3. 联合索引没遵循最左前缀

  4. OR条件导致索引失效

页级锁:一句话带过就行

InnoDB 内部用latch(闩锁)保护 B+ 树的数据页,持有时间是微秒级,跟事务锁完全两码事。面试问到页级锁,说一句"BDB 引擎用的,已废弃,InnoDB 用行级锁"就够了。别在这浪费时间。

面试追问三连:答到这个程度就够了

Q1:为什么 InnoDB 不用表级锁?

OLTP 场景的核心诉求是高并发短事务。表级锁一锁就是整张表,100 个事务改不同行也得排队——彻底废掉并发能力。InnoDB 选行级锁,允许不同事务同时操作不同行,代价是锁管理内存开销大一点,但对于高并发场景这个交换完全值得。

Q2:FOR UPDATE什么时候会锁表?

WHERE 条件无法使用索引时。InnoDB 行锁加在索引上,没索引就没有"定位到具体行"的能力,只能全表扫描逐行加锁。面试答这一句就够了,但最好补一个真实案例——比如 varchar 字段传了 int 值导致隐式转换索引失效。

Q3:Next-Key Lock 和 Gap Lock 什么关系?

Next-Key Lock = Record Lock + Gap Lock。RR 隔离级别下 InnoDB 默认用 Next-Key Lock——既锁住当前记录,又锁住前面的间隙,防止别的事务在这个范围插入新行(防幻读)。如果查询精确命中唯一索引,InnoDB 会优化为只加 Record Lock(因为唯一索引保证了不会有新行插进来)。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。 谢谢支持哟 (*^__^*)
http://www.jsqmd.com/news/703344/

相关文章:

  • Azure DevOps自托管构建代理:从核心原理到大规模部署实战
  • 终极命令行数据可视化指南:如何用Python实现4倍分辨率的终端绘图
  • 千兆宽带实际网速为啥都达不到千兆?
  • 别再傻傻分不清了!一文搞懂PCIe配置空间里的VSC、VSEC和DVSEC到底啥区别
  • Stream-Translator 终极指南:实时直播音频转录与翻译实战
  • Linux驱动调试新思路:不写代码,用sysfs直接玩转GPIO(以IMX6ULL GPIO5_3为例)
  • 主流犬种图解指南 All In One
  • 手把手教你为ECharts地图集成离线行政区划查询:AreaCity-Query-Geometry实战
  • Snap.Hutao原神工具箱终极指南:如何彻底解决你的游戏数据管理痛点
  • 魔兽世界API开发深度解析:3个实战场景与性能优化技巧
  • Excalidraw手绘白板:从零到一的完整协作绘图指南
  • 如何系统优化PINNs:物理信息神经网络的高级应用策略
  • 美欧紧急呼叫定位体系比较:法规、技术与实践
  • League Akari:英雄联盟玩家的终极本地化效率工具完整指南
  • 广州市加急快速GEO AI优化公司代运营哪家专业 - 舒雯文化
  • Multi-Head Latent Attention:低秩近似优化Transformer计算效率
  • 2026年聊聊上海虹际玻纤复合风管,其工艺先进吗?哪个口碑好 - 工业设备
  • F3D三维查看器:专业级快速3D模型预览解决方案
  • M2LOrder情绪识别模型一键部署教程:Python环境快速配置指南
  • Poor Man‘s T-SQL Formatter:让杂乱的SQL代码瞬间整洁的专业工具
  • 4月26日成都地区安泰产热轧H型钢(1998-Q355B;100-1000mm)最新报价 - 四川盛世钢联营销中心
  • 游戏加速新体验:OpenSpeedy带你打破帧率束缚
  • Divinity Mod Manager:解决《神界原罪2》模组管理复杂性的技术方案
  • 3分钟掌握缠论:ChanlunX让技术分析可视化变得如此简单
  • 深度强化学习实战:从DQN到A3C的TensorFlow实现与调优指南
  • Zabbix监控K8s集群状态:从API Server到Node节点的保姆级配置与排错实录
  • 专业视角!AI专著生成与撰写,20万字专著写作工具大推荐
  • B站视频下载神器:BilibiliDown 三步轻松保存高清视频的终极指南
  • 3个核心功能,帮你解决视频素材收集的90%烦恼:res-downloader全解析
  • 小红书数据采集终极指南:5个Python技巧让爬虫更智能