innodb存储引擎如何实现行锁_mysql行锁机制解析
发布时间 - 2025-12-27 00:00:00 点击率:次InnoDB行锁本质是索引锁,无索引则退化为表锁;Record Lock锁单记录,Gap Lock锁间隙,Next-Key Lock(Record+Gap)防幻读;RR级别依赖Next-Key Lock控制幻读,但需索引支持;锁状态可通过information_schema相关视图查看。
InnoDB 的行锁不是直接锁“行”,而是通过索引实现的——没有索引,就退化为表锁。 这是理解 InnoDB 行锁机制最关键的起点。很多人遇到“明明只更新一行,却锁住整个表”的问题,根源往往就在这里。
行锁依赖索引:锁的是索引记录,不是数据行本身
InnoDB 的行级锁(Record Lock、Gap Lock、Next-Key Lock)全部作用在索引树的节点上。即使表中只有一条数据,只要 WHERE 条件无法命中索引(比如用了非索引列、函数、隐式类型转换),InnoDB 就无法精确定位记录,只能遍历聚簇索引,最终升级为表级意向锁+全表扫描,实际效果等同于锁表。
- 主键或唯一索引上的等值查询 → 加 Record Lock(单条记录)
- 普通索引上的等值查询 → 同样加 Record Lock,但会先在二级索引上加锁,再回表到聚簇索引加锁
- 范围查询(如
WHERE age > 25)→ 加 Next-Key Lock(Record Lock + Gap Lock),既锁记录也锁间隙,防止幻读 - 无可用索引 → 优化器走全表扫描,每条记录都尝试加锁,同时持有意向锁(IX),其他事务无法修改任何行,表现接近表锁
三种核心行锁类型及其触发场景
并不是所有 UPDATE/DELETE 都加同一种锁。InnoDB 根据语句类型、隔离级别、索引情况动态选择锁粒度:
- Record Lock:锁定索引中的某一条具体记录(例如主键值为 100 的行)。仅在唯一索引的等值精确匹配时最常见。
- Gap Lock:锁定两个索引记录之间的“间隙”,不包含记录本身(例如 (10, 20) 之间的空档)。主要用于 RR 隔离级别下防止插入新记录导致幻读,但 在唯一索引的等值查询中不会使用 Gap Lock。
- Next-Key Lock:Record Lock + Gap Lock 的组合,即“前开后闭”区间(如 (10, 20])。这是 RR 级别下范围查询的默认行为,也是解决幻读的核心机制。
可重复读(RR)下的幻读控制:Next-Key Lock 是关键
很多人误以为 RR 完全杜绝幻读,其实
它只是通过 Next-Key Lock 把“幻象插入”也纳入锁定范围。例如执行 SELECT * FROM t WHERE id BETWEEN 10 AND 20 FOR UPDATE:
- 如果 id 是主键且存在 10、15、20 三条记录,则锁住 (−∞,10], (10,15], (15,20], (20,+∞) 四个区间
- 这意味着其他事务不能在这些间隙中 INSERT 新的 id(如 12 或 25),从而避免了再次 SELECT 时出现“多出来”的行
- 但如果 WHERE 条件没走索引,InnoDB 锁不住间隙,幻读风险依然存在
查看行锁状态:从 information_schema 入手
排查锁冲突不能只靠猜测,要结合系统视图验证:
- information_schema.INNODB_TRX:查当前活跃事务、运行时间、事务状态、SQL 语句
- information_schema.INNODB_LOCKS(MySQL 5.7 及以前)或 performance_schema.data_locks(8.0+):看每个事务持有哪些锁、锁在哪条索引记录上
- information_schema.INNODB_LOCK_WAITS:直接看到谁在等谁、等什么锁、阻塞链路
- 配合
SHOW ENGINE INNODB STATUS\G,能获取更详细的锁等待摘要和最近死锁信息
# mysql
# ai
# 隐式类型转换
# sql
# for
# select
# delete
# 类型转换
# 这是
# 很多人
# 加锁
# 主键
# 死锁
# 锁住
# 的是
# 遍历
# 用了
# 三种
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
,怎么在广州志愿者网站注册?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
如何在搬瓦工VPS快速搭建网站?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
nginx修改上传文件大小限制的方法
如何快速重置建站主机并恢复默认配置?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Python函数文档自动校验_规范解析【教程】
iOS发送验证码倒计时应用
高防服务器如何保障网站安全无虞?
如何在阿里云虚拟主机上快速搭建个人网站?
太平洋网站制作公司,网络用语太平洋是什么意思?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
微信小程序 配置文件详细介绍
Laravel如何实现API版本控制_Laravel版本化API设计方案
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
javascript中的try catch异常捕获机制用法分析
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
如何实现建站之星域名转发设置?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
公司网站制作需要多少钱,找人做公司网站需要多少钱?
想要更高端的建设网站,这些原则一定要坚持!
如何续费美橙建站之星域名及服务?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
高端网站建设与定制开发一站式解决方案 中企动力
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
javascript中闭包概念与用法深入理解
教你用AI润色文章,让你的文字表达更专业
Android实现代码画虚线边框背景效果
北京专业网站制作设计师招聘,北京白云观官方网站?
Java类加载基本过程详细介绍
如何快速生成可下载的建站源码工具?
详解MySQL数据库的安装与密码配置
制作公司内部网站有哪些,内网如何建网站?
微信小程序 canvas开发实例及注意事项
jQuery 常见小例汇总
使用豆包 AI 辅助进行简单网页 HTML 结构设计
网页制作模板网站推荐,网页设计海报之类的素材哪里好?

