5.4.3 InnoDB ⾏锁

发布时间:2026/9/28 18:36:01

5.4.3 InnoDB ⾏锁 InnoDB 的行锁是 MySQL 实现高并发能力的核心也是 InnoDB 能够成为默认存储引擎的重要原因。与 MyISAM 的表级锁不同InnoDB 的行锁粒度更细允许多个事务同时修改同一张表的不同行从而显著提升数据库的并发性能。 InnoDB 行锁的基石索引InnoDB 的行锁有一个核心特性锁是加在索引记录上的。命中索引如果查询条件能有效利用索引InnoDB 就只锁定命中的那几行并发性最高。未命中索引如果查询条件没有可用的索引InnoDB 只能进行全表扫描这会锁住表中的每一行效果等同于表锁会严重阻塞并发。因此为查询条件建立合理的索引是使用行锁、保证高并发性能的前提。️ InnoDB 行锁的两大基本类型和表锁一样行锁也分为两种基本模式。锁类型英文俗称作用兼容性共享锁Shared Lock (S Lock)读锁允许事务读取一行数据但禁止修改该行。多个事务的S锁可以同时加在同一行上互不阻塞。排他锁Exclusive Lock (X Lock)写锁允许事务读取和修改数据。一个事务加了X锁其他事务不能再对该行加任何锁S或X。如何触发共享锁 (S)手动添加使用SELECT ... FOR SHARE(MySQL 8.0)或SELECT ... LOCK IN SHARE MODE。排他锁 (X)UPDATE、DELETE、INSERT语句会自动添加。手动添加使用SELECT ... FOR UPDATE。这两种锁是行锁的“权限”基础在实际加锁时会具体表现为下面三种算法。⚙️ 行锁的三种实现算法这是 InnoDB 行锁最精细的部分决定了锁住的具体范围。1. 记录锁 (Record Lock)描述锁定单个索引记录也就是锁定一行。它是最基本的行锁粒度最细并发影响最小。场景在唯一索引包括主键的等值查询中并且记录存在时会使用记录锁。-- 假设 id 是主键BEGIN;-- 这条语句会在 id1 的索引记录上加一个排他的记录锁SELECT*FROMusersWHEREid1FORUPDATE;COMMIT;2. 间隙锁 (Gap Lock)描述锁定一个索引范围但不包括记录本身。它的目的是防止其他事务在这个间隙中插入新记录。场景只在REPEATABLE READ及更高的隔离级别下生效。在READ COMMITTED级别下不会使用。-- 假设 users 表有 id 值为 1, 5, 10BEGIN;-- 这条语句可能会在 (1, 5) 和 (5, 10) 等间隙上加上间隙锁SELECT*FROMusersWHEREidBETWEEN3AND7FORUPDATE;COMMIT;此时其他事务将无法插入id为 4 或 6 的新记录直到该事务结束。3. 临键锁 (Next-Key Lock)描述记录锁 间隙锁的组合。它锁定一个左开右闭的索引区间。例如对于id值为1, 5, 10临键锁会锁定(1, 5]这个范围既防止修改id5的记录也防止在(1,5)之间插入新记录。场景这是 InnoDB 在REPEATABLE READ隔离级别下的默认行锁算法也是其解决幻读问题的核心机制。临键锁的退化规则RR级别下唯一索引等值查询且记录存在临键锁会退化为记录锁只锁该行。唯一索引等值查询且记录不存在临键锁会退化为间隙锁只锁间隙。非唯一索引等值查询无论记录是否存在都会使用临键锁。范围查询会对扫描到的所有索引记录及其间隙加临键锁。4. 插入意向锁 (Insert Intention Lock)这是一种特殊的间隙锁由INSERT操作在等待间隙锁时获取。它表明事务打算在某个间隙中插入新数据多个事务可以在同一个间隙的不同位置插入只要插入的位置不冲突。 辅助工具意向锁 (Intention Lock)意向锁是 InnoDB 自动添加的表级锁用于协调行锁和表锁之间的关系。意向共享锁 (IS)事务准备给某些行加S 锁前先给表加 IS 锁。意向排他锁 (IX)事务准备给某些行加X 锁前先给表加 IX 锁。它们的作用就像一个“门卫”。当另一个事务想给整个表加锁如LOCK TABLES ... WRITE时只需检查表级是否有 IX 或 IS 锁就能快速判断是否有行锁存在而无需遍历所有行去检查。 锁的兼容性矩阵下表总结了各种锁之间的兼容性。锁类型意向共享锁 (IS)意向排他锁 (IX)共享锁 (S)排他锁 (X)意向共享锁 (IS)✅ 兼容✅ 兼容✅ 兼容❌ 冲突意向排他锁 (IX)✅ 兼容✅ 兼容❌ 冲突❌ 冲突共享锁 (S)✅ 兼容❌ 冲突✅ 兼容❌ 冲突排他锁 (X)❌ 冲突❌ 冲突❌ 冲突❌ 冲突兼容表示两种锁可以同时存在冲突则表示后申请的锁必须等待前一个锁释放。 行锁引发的问题死锁 (Deadlock)两个或多个事务相互等待对方持有的锁导致所有事务都无法继续。InnoDB 的处理自动检测死锁并回滚“代价较小”的事务。如何避免固定访问顺序所有事务都按相同顺序如主键升序访问表和行。缩短事务减少锁持有时间降低冲突窗口。使用READ COMMITTED隔离级别该级别下没有间隙锁能大幅降低死锁概率。应用层重试捕获死锁异常如Error 1213并重试整个事务。锁等待超时 (Lock Wait Timeout)事务等待锁的时间超过了innodb_lock_wait_timeout默认50秒设置的阈值事务会自动回滚。️ 如何监控和分析行锁SHOW ENGINE INNODB STATUS查看 InnoDB 的整体状态其中LATEST DETECTED DEADLOCK部分记录了最近一次死锁的详细信息。performance_schema.data_locks表 (MySQL 8.0)直接查询当前数据库中的所有锁信息是诊断锁问题最直接的方法。performance_schema.data_lock_waits表 (MySQL 8.0)显示当前的锁等待关系即哪个事务在等待哪个事务持有的锁。 总结InnoDB 的行锁是一个精密的系统理解其核心要点是写出高性能、高并发 SQL 的基础锁是加在索引上的这是行锁生效的前提无索引则退化为表锁。两大基本类型共享锁S读锁和排他锁X写锁。三种实现算法记录锁锁行、间隙锁锁范围、临键锁锁行范围RR默认。意向锁是门卫表级意向锁IS/IX用于快速判断表锁与行锁的冲突。RR 级别下临键锁防幻读这是 InnoDB 默认隔离级别REPEATABLE READ能保证数据一致性的关键。死锁不可怕理解其成因特别是间隙锁通过规范编码和重试机制来应对。
延伸阅读

更多相关文章

2026/9/27 21:48:58

2026年东北推拉门供应商精选,靠谱门店这样选

2026年东北推拉门供应商精选,靠谱门店这样选一、 业务标题是什么:东北推拉门供应商选择的核心命题随着东北地区城市化进程的持续深化与消费升级,推拉门已从单一的隔断功能演变为提升居住品质、彰显空间美学的重要组成部分。对于沈阳、大连、长…

2026/9/27 12:49:01

多Agent编排核心技术全解:从模式设计到实战应用

1. 项目概述:从单兵作战到团队协作的进化如果你已经玩过一阵子AI Agent,搭建过几个能查天气、写周报的“智能体”,那你可能已经感受到了单Agent的局限性。它就像一个全能的个人助理,虽然能干,但面对一个复杂的项目——…

2026/9/22 18:21:19

《战舰世界》超级意战“沉舰者”实战解析:烟幕与SAP的战术运用

这次我们来看一个《战舰世界》游戏中的实战案例解析,聚焦于“猫叔不吃鱼”玩家操控超级意大利战列舰“沉舰者”的一场精彩对局。对于《战舰世界》的玩家,尤其是战列舰爱好者而言,理解一艘顶级金币船的实战打法、定位和优劣势,远比…

2026/9/28 18:33:39

Express 操作 MongoDB:用 Mongoose 搭一套可复用的数据层骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 18:33:39

Java OA自动化办公系统源码实战:从本地部署到二次开发

简介:面向需要搭建办公自动化系统的Java开发者,这份基于Spring Boot、Maven与MySQL的OA系统源码覆盖日常办公管理核心功能,可帮助理解企业级项目从分层架构到数据持久化的完整落地路径。压缩包共1031个文件,以237个Java源文件为主…

2026/9/28 18:33:39

sv协议说明:IEC61850 采样值 GOOSE/SMV 报文与 ASDU 结构解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 18:33:39

Python电影数据分析毕设实战:爬虫、SQLite与ECharts可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的电影数据分析与可视化毕业设计资料,适合正在准备毕设、课程设计或期末大作业的同学直接参考使用。资源包共39个文件,约20.87MB,包含Python源码、答辩PPT、项目说明文档、数…

2026/9/28 18:28:38

开关电源输出纹波示波器测试设置规范

前言文件版本:V1.0编制目的:明确电源输出纹波测试中交流耦合(AC档)、20MHz带宽限制的定义、原理与执行要求,统一测试条件,保证测试数据可对比、可复现适用范围:DC-DC、开关电源模块、板载电源输…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑