MySQL锁机制全解析:从原理到线上避坑
两个用户同时修改同一条订单数据其中一个请求直接报错Lock wait timeout exceeded线上突然大量请求超时排查后发现是一条UPDATE语句没走索引把整张表都锁了执行ALTER TABLE加索引的时候卡住所有DML请求全部堆积数据库直接雪崩这些问题的核心都和MySQL的锁机制有关。今天我们就把MySQL的锁从原理到实战一次性讲透帮你避开线上90%的锁相关的坑。一、MySQL锁到底在解决什么问题想象你是一个图书馆管理员书架上有1000本书两个人同时借同一本书如果没有规则系统无法判断到底借给谁 → 这就是并发写冲突MySQL用排他锁X锁解决谁先拿到锁谁先操作另一个人等着读者正在看书的时候管理员想撕掉其中一页重新印 → 这就是读写冲突MySQL用共享锁S锁解决看书的人可以加共享锁多个人可以同时看但管理员要改内容必须等所有人都看完你正在整理科幻区第3排到第7排的书有人想往第5排塞一本新书进去你还没整理完他塞进去你就找不到了 → 这就是幻读问题MySQL用间隙锁Gap Lock解决锁定这段区间不允许别人在中间插入新的东西二、MySQL锁的全景分类MySQL的锁可以按粒度分为表级锁、行级锁、意向锁RR隔离级别下还有专门解决幻读的间隙锁和临键锁另外还有容易被忽略的MDL元数据锁。1. 表级锁锁住整张表表共享读锁LOCK TABLE xxx READ多个事务可以同时加读锁有读锁时其他事务不能写表排他写锁LOCK TABLE xxx WRITE只有一个事务持有其他事务读写都阻塞适用场景MyISAM引擎默认用表锁InnoDB一般不会手动用表锁粒度太大并发太差2. 行级锁InnoDB的核心能力行锁是InnoDB特有的能力只锁被操作的数据行并发度高。但很多人不知道的是InnoDB的行锁是加在索引上的而不是数据行上这个特性决定了行锁的生效条件只有SQL走了索引行锁才会生效如果没走索引行锁会退化成表锁这是线上事故的高发点。行锁按功能分为两类共享锁S锁读锁多个事务可以同时加S锁有S锁时其他事务不能加X锁修改数据。手动加锁方式SELECT ... LOCK IN SHARE MODE排他锁X锁写锁当前事务独占其他事务不能加S锁也不能加X锁读写都阻塞。UPDATE、DELETE、INSERT会自动加X锁手动加锁方式SELECT ... FOR UPDATE3. 意向锁InnoDB的“导航系统”意向锁是表级锁InnoDB自动加不需要手动干预分两种意向共享锁IS事务准备给表中某些行加S锁先给表加IS意向排他锁IX事务准备给表中某些行加X锁先给表加IX意向锁的作用是什么假设没有意向锁当你想给整张表加写锁的时候系统需要遍历表中每一行检查有没有行锁在千万级记录的表里这个开销是不可接受的。有了意向锁之后只需要检查表上有没有冲突的意向锁就行比如表上有IX锁就说明有事务正在给行加X锁不能加表写锁大幅提高了锁检查的效率。4. RR隔离级别特有解决幻读的锁间隙锁Gap Lock锁住索引记录之间的间隙不锁记录本身防止其他事务在间隙中插入新数据。只存在于RR隔离级别RC隔离级别没有间隙锁临键锁Next-Key Lock记录锁间隙锁的组合左开右闭区间锁住当前记录的同时锁住前面的间隙是RR隔离级别下InnoDB的默认加锁行为。当查询命中唯一索引做等值匹配时临键锁会退化成普通记录锁减小锁定范围5. MDL元数据锁容易被忽略的坑MySQL5.6之后引入访问表时自动获取MDL读锁执行增删改查DML时自动加多个事务可以共享MDL写锁执行ALTER TABLE等DDL时自动加排他锁经典坑点一个长事务持有MDL读锁一直没提交此时执行ALTER TABLE会被阻塞后续所有对该表的DML请求全部堆积直接导致数据库雪崩。三、行锁的加锁规则详解假设表users有主键索引id现有数据id 5, 10, 15在RR隔离级别下执行SELECT * FROM users WHERE id 10 FOR UPDATE命中唯一索引等值查询临键锁退化为记录锁只锁id10这一行执行SELECT * FROM users WHERE id 5 AND id 15 FOR UPDATE范围查询加临键锁锁定区间(5, 15]也就是id10和id15的记录以及5到10、10到15的间隙其他事务不能在这个区间插入新数据执行SELECT * FROM users WHERE id 12 FOR UPDATE记录不存在临键锁退化为间隙锁锁定区间(10, 15)其他事务不能在这个区间插入id12的数据再看非唯一索引的情况假设表orders有普通索引user_id现有数据user_id 1, 3, 5执行SELECT * FROM orders WHERE user_id 3 FOR UPDATE非唯一索引等值查询会对命中的二级索引记录加临键锁直到扫描到第一个不符合条件的记录退化为间隙锁同时会对命中的记录的主键索引加记录锁四、锁的兼容性速记表格锁类型S锁读X锁写IS锁IX锁S锁读✅ 兼容❌ 冲突✅ 兼容❌ 冲突X锁写❌ 冲突❌ 冲突❌ 冲突❌ 冲突IS锁✅ 兼容❌ 冲突✅ 兼容✅ 兼容IX锁❌ 冲突❌ 冲突✅ 兼容✅ 兼容一句话总结读读不冲突读写冲突写写冲突意向锁之间互相兼容只和表级读写锁互斥。五、实际开发中的避坑指南UPDATE/DELETE一定要走索引执行前先用EXPLAIN看执行计划确保type不是ALL全表扫描否则行锁会退化成表锁并发直接崩掉控制事务粒度不要在事务里做远程调用、大文件读写等耗时操作尽量缩短事务持有锁的时间避免长事务持有MDL锁阻塞DDL合理选择隔离级别如果你的业务对幻读不敏感比如大部分互联网业务可以把隔离级别降到RC减少间隙锁带来的锁范围提高并发性能死锁排查如果出现死锁用SHOW ENGINE INNODB STATUS查看LATEST DETECTED DEADLOCK部分或者查询performance_schema.data_locks表查看当前锁的持有和等待情况

相关新闻

d3dxSkinManage 快速教程:15 分钟整理好 3DMigoto 皮肤模组

d3dxSkinManage 快速教程:15 分钟整理好 3DMigoto 皮肤模组

d3dxSkinManage 快速教程:15 分钟整理好 3DMigoto 皮肤模组 【免费下载链接】d3dxSkinManage 3dmigoto skin mods manage tool 项目地址: https://gitcode.com/gh_mirrors/d3/d3dxSkinManage 装到第 20 个皮肤模组时,Mods 文件夹已经找不到头尾&a…

2026/8/24 17:12:28 阅读更多 →
一图看懂OpenWMS.org:28个微服务如何组成企业级WMS仓库管理系统

一图看懂OpenWMS.org:28个微服务如何组成企业级WMS仓库管理系统

一图看懂OpenWMS.org:28个微服务如何组成企业级WMS仓库管理系统 【免费下载链接】org.openwms Open Warehouse Management System 项目地址: https://gitcode.com/gh_mirrors/or/org.openwms OpenWMS 是一款完全开源(Apache 2.0 协议)…

2026/8/24 17:12:28 阅读更多 →
C++函数模板:从基础语法到高级应用与性能优化

C++函数模板:从基础语法到高级应用与性能优化

1. 从“重复造轮子”到“一劳永逸”的思维转变如果你写过C,大概率遇到过这样的场景:你需要一个函数来比较两个整数的大小,于是你写了个int max(int a, int b)。过一会儿,你又需要比较两个浮点数,于是你又写了个float m…

2026/8/24 17:12:28 阅读更多 →

最新新闻

Windows安全中心全灰之后:一条命令快速恢复 Windows Defender

Windows安全中心全灰之后:一条命令快速恢复 Windows Defender

Windows安全中心全灰之后:一条命令快速恢复 Windows Defender 【免费下载链接】no-defender A slightly more fun way to disable windows defender firewall. (through the WSC api) 项目地址: https://gitcode.com/GitHub_Trending/no/no-defender 安全中…

2026/8/24 18:56:35 阅读更多 →
Simulink全桥逆变电路建模:6 IGBT拓扑与开关过程仿真分析

Simulink全桥逆变电路建模:6 IGBT拓扑与开关过程仿真分析

1. 项目缘起:为什么从全桥电路开始? 如果你正在接触电力电子,尤其是开关电源、逆变器或者电机驱动,那么“全桥电路”这个结构对你来说一定不陌生。它几乎是中高功率等级应用中的“标配”拓扑,从我们日常用的电磁炉、电…

2026/8/24 18:56:35 阅读更多 →
X-Mouse Controls 完整指南:用 3 个参数实现焦点跟随鼠标,去掉多窗口切换的多余点击

X-Mouse Controls 完整指南:用 3 个参数实现焦点跟随鼠标,去掉多窗口切换的多余点击

X-Mouse Controls 完整指南:用 3 个参数实现焦点跟随鼠标,去掉多窗口切换的多余点击 【免费下载链接】xmouse-controls Microsoft Windows utility to manage the active window tracking/raising settings. This is known as x-mouse behavior or focus…

2026/8/24 18:56:35 阅读更多 →
C语言数组与指针实战:从基础到冒泡排序与内存管理

C语言数组与指针实战:从基础到冒泡排序与内存管理

大家好,我是长期分享C语言实战经验的博主。在初学C语言时,数组、指针、排序这些概念常常让开发者感到混乱,尤其是面对二维数组、字符串数组和排序算法时,网上资料往往零散不成体系。本文将系统性地梳理C语言数组的核心知识&#x…

2026/8/24 18:56:35 阅读更多 →
互联网医疗Java技术栈实战与面试指南

互联网医疗Java技术栈实战与面试指南

1. 互联网医疗行业的技术挑战与人才需求互联网医疗行业近年来呈现爆发式增长,这个领域的技术架构既要满足医疗行业特有的严谨性和合规性要求,又要具备互联网产品的高并发、高可用特性。作为从业多年的技术面试官,我发现大厂在招聘Java工程师时…

2026/8/24 18:56:35 阅读更多 →
C语言实现控制台3D玫瑰:数学建模与字符图形渲染实战

C语言实现控制台3D玫瑰:数学建模与字符图形渲染实战

1. 项目缘起:当C语言遇上浪漫 最近在技术社区里,看到不少朋友在讨论用各种编程语言画图,Python的turtle库、JavaScript的Canvas自然是常客。但作为一个老C程序员,我心里总有点不服气:难道C语言就只能处理枯燥的数据和算…

2026/8/24 18:55:35 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →