MySQL中都有哪些锁类型?现场!

2026-04-29 21:204阅读0评论SEO优化
  • 内容介绍
  • 文章标签
  • 相关推荐

前言——别说我没提醒你, MySQL的锁可不是闹着玩的

先来一句鸡汤:数据库的锁,就像是夜店里的保镖,谁不想进门,却得排队等。这玩意儿一不小心就卡死你的业务,甚至让你怀疑人生。下面咱们把MySQL里各种“神秘组织”——锁类型——一股脑儿抖出来 顺便甩几句情绪垃圾,保准你看完后想马上去重启实例。

1️⃣ 行级锁 & 表级锁 & 页级锁——粒度大小随意切

痛并快乐着。 行级锁是最细的, 你想把某条记录拎出来单独拴住;表级锁就是把整张桌子搬到门口,谁想坐都得等;页级锁介于两者之间,好像是把几行装进一个盒子里封死。

MySQL进阶突击系列(06)MySQL有几种锁?| 别背答案,现场演示一下

要记住一点:InnoDB默认用行级锁,主要原因是它“高效”。MyISAM只能玩表级锁,那种场景下只适合一次性导入大批数据后再读,累并充实着。。

2️⃣ 共享锁 S 锁 & 排他锁 X 锁——爱分享还是爱独占

这是可以说的吗? S 锁可以多人一边读,但没人能写。 X 锁写谁也不让读,只有拿到钥匙的人才能动弹。

有意思的是 如果数据已经被 X 锁住读操作仍然可以看到旧版本的数据但不能加 S 锁,也就是“读不到最新的”。这点经常被新人忽略, 以为 X 锁直接阻塞 SELECT,后来啊却发现 SELECT 还能跑,只是看不到未提交的改动,试试水。。

3️⃣ 意向锁——给表加标记,让系统省事儿

不忍卒读。 Intention Shared / Intention Exclusive 就是“我要在这张表里搞点小动作”。它们本身不阻塞任何事务,只是告诉存储引擎:“别在这张表上再加全局排他锁了”。如果你要对某行加 X 锁,就必须先对表加 IX 锁;如果要 S 锁,则先加 IS 锁。

4️⃣ 间隙锁 Gap Locks & 临键锁 Next‑Key Locks——防止幻读的秘密武器

间隙锁顾名思义, 就是把索引间的空隙给拴住防止其他事务往里插新记录,从而产生幻读。临键锁 = 记录锁 + 间隙锁,它不仅拦截目标记录,还拦截它前后的空位,躺平...。

实战小技巧:在可重复读隔离级别下用 SELECT ... FOR UPDATE 会自动产生临键锁;用 SELECT ... LOCK IN SHARE MODE 则产生共享间隙锁。

5️⃣ 自增主键锁——插入时的小霸王

自增列背后有个专门的 auto‑increment lock。它是表级别的轻量级排他锁,只在插入时抢夺自增值。高并发下容易成为瓶颈, 你可以通过 #SET innodb_autoinc_lock_mode=2; 把它改成“交叉”模式,以提升并发度,恳请大家...。

噪音时间——写点情感垃圾让文章更有人味

哎呀,我真的受不了这些层层叠叠的 lock 名称了!每次 DBA 在会议上说:“我们遇到死锁了”,我就感觉自己的心脏要跳出胸腔。

内卷... 狂怒模式开启: “我到底是在写代码还是在打盹?🤯 每次看到 Error 1205 : Lock wait timeout exceeded, 我就想把服务器拔掉再拔回来。”

随机产品对比表 —— 给你一点非技术噱头

# 产品名称 适用场景 核心功能 价格区间
1 LokiLock Monitor™️ 大型电商 高并发OLTP 实时死锁检测 可视化热点图谱 自动报警短信/钉钉 1999‑4999/年
2 PandaLock Analyzer Pro 金融核心系统 强一致性需求 MVCC 深度剖析 事务回滚模拟 历史快照对比工具

6️⃣ 死亡之路——常见死锁场景速查清单

  • A事务更新 id=10,然后 B事务更新 id=20;接着 A 再去更新 id=20 → 死!B 再去更新 id=10 → 死!循环依赖。
  • SLOCK+XLOCK 混用:A 用 SELECT … LOCK IN SHARE MODE 抢 S 锁, B 用 UPDATE 抢 X 锁,两者互相等待。
  • Gap Lock + Insert:A 对范围 加 Gap Lock,B 想往 7 插入新记录 → 被卡住 → 超时→ 死局。

调试小技巧 —— 快速定位死锁根源:

  1. SHOW ENGINE INNODB STATUS\G;
  2. Mysqladmin processlist;
  3. 开启 innodb_print_all_deadlocks=ON ,让日志自动输出所有死镇信息。
  4. CUSTOM LOG: 在业务代码里自行打印事务 ID 与关键 SQL,用于事后追踪。

—— 不要被 Lock 吓倒,你才是主宰!🚀💪🏻

格局小了。 If you think locks are just “好难懂”, 那就对了主要原因是它们本身就是为了解决并发而诞生的复杂产物。不过只要掌握了上面几类基本概念, 再配合一点经验和工具,你完全可以在生产环境里安然自若地玩转 MySQL。记得:

  • S vs X:共享能共读,不共享只能独占;别忘了 MVCC 能让 X 锁下仍然读取旧版本。
  • \
  • I‑Locks:DML 前先搞好意向标记,否则全局 DDL 会卡住整个库。
  • \
  • K‑Locks: 是防幻读神器, 但也会导致 Insert 卡顿,需要权衡使用范围查询或唯一索引。
  • \

*温馨提示*: 在生产环境中调低事务隔离等级或随意关闭 gap lock, 会导致数据完整性风险,请三思而后行!祝各位 DBA 夜以继日、代码永无 BUG~ 🎉🧨📈,一言难尽。

前言——别说我没提醒你, MySQL的锁可不是闹着玩的

先来一句鸡汤:数据库的锁,就像是夜店里的保镖,谁不想进门,却得排队等。这玩意儿一不小心就卡死你的业务,甚至让你怀疑人生。下面咱们把MySQL里各种“神秘组织”——锁类型——一股脑儿抖出来 顺便甩几句情绪垃圾,保准你看完后想马上去重启实例。

1️⃣ 行级锁 & 表级锁 & 页级锁——粒度大小随意切

痛并快乐着。 行级锁是最细的, 你想把某条记录拎出来单独拴住;表级锁就是把整张桌子搬到门口,谁想坐都得等;页级锁介于两者之间,好像是把几行装进一个盒子里封死。

MySQL进阶突击系列(06)MySQL有几种锁?| 别背答案,现场演示一下

要记住一点:InnoDB默认用行级锁,主要原因是它“高效”。MyISAM只能玩表级锁,那种场景下只适合一次性导入大批数据后再读,累并充实着。。

2️⃣ 共享锁 S 锁 & 排他锁 X 锁——爱分享还是爱独占

这是可以说的吗? S 锁可以多人一边读,但没人能写。 X 锁写谁也不让读,只有拿到钥匙的人才能动弹。

有意思的是 如果数据已经被 X 锁住读操作仍然可以看到旧版本的数据但不能加 S 锁,也就是“读不到最新的”。这点经常被新人忽略, 以为 X 锁直接阻塞 SELECT,后来啊却发现 SELECT 还能跑,只是看不到未提交的改动,试试水。。

3️⃣ 意向锁——给表加标记,让系统省事儿

不忍卒读。 Intention Shared / Intention Exclusive 就是“我要在这张表里搞点小动作”。它们本身不阻塞任何事务,只是告诉存储引擎:“别在这张表上再加全局排他锁了”。如果你要对某行加 X 锁,就必须先对表加 IX 锁;如果要 S 锁,则先加 IS 锁。

4️⃣ 间隙锁 Gap Locks & 临键锁 Next‑Key Locks——防止幻读的秘密武器

间隙锁顾名思义, 就是把索引间的空隙给拴住防止其他事务往里插新记录,从而产生幻读。临键锁 = 记录锁 + 间隙锁,它不仅拦截目标记录,还拦截它前后的空位,躺平...。

实战小技巧:在可重复读隔离级别下用 SELECT ... FOR UPDATE 会自动产生临键锁;用 SELECT ... LOCK IN SHARE MODE 则产生共享间隙锁。

5️⃣ 自增主键锁——插入时的小霸王

自增列背后有个专门的 auto‑increment lock。它是表级别的轻量级排他锁,只在插入时抢夺自增值。高并发下容易成为瓶颈, 你可以通过 #SET innodb_autoinc_lock_mode=2; 把它改成“交叉”模式,以提升并发度,恳请大家...。

噪音时间——写点情感垃圾让文章更有人味

哎呀,我真的受不了这些层层叠叠的 lock 名称了!每次 DBA 在会议上说:“我们遇到死锁了”,我就感觉自己的心脏要跳出胸腔。

内卷... 狂怒模式开启: “我到底是在写代码还是在打盹?🤯 每次看到 Error 1205 : Lock wait timeout exceeded, 我就想把服务器拔掉再拔回来。”

随机产品对比表 —— 给你一点非技术噱头

# 产品名称 适用场景 核心功能 价格区间
1 LokiLock Monitor™️ 大型电商 高并发OLTP 实时死锁检测 可视化热点图谱 自动报警短信/钉钉 1999‑4999/年
2 PandaLock Analyzer Pro 金融核心系统 强一致性需求 MVCC 深度剖析 事务回滚模拟 历史快照对比工具

6️⃣ 死亡之路——常见死锁场景速查清单

  • A事务更新 id=10,然后 B事务更新 id=20;接着 A 再去更新 id=20 → 死!B 再去更新 id=10 → 死!循环依赖。
  • SLOCK+XLOCK 混用:A 用 SELECT … LOCK IN SHARE MODE 抢 S 锁, B 用 UPDATE 抢 X 锁,两者互相等待。
  • Gap Lock + Insert:A 对范围 加 Gap Lock,B 想往 7 插入新记录 → 被卡住 → 超时→ 死局。

调试小技巧 —— 快速定位死锁根源:

  1. SHOW ENGINE INNODB STATUS\G;
  2. Mysqladmin processlist;
  3. 开启 innodb_print_all_deadlocks=ON ,让日志自动输出所有死镇信息。
  4. CUSTOM LOG: 在业务代码里自行打印事务 ID 与关键 SQL,用于事后追踪。

—— 不要被 Lock 吓倒,你才是主宰!🚀💪🏻

格局小了。 If you think locks are just “好难懂”, 那就对了主要原因是它们本身就是为了解决并发而诞生的复杂产物。不过只要掌握了上面几类基本概念, 再配合一点经验和工具,你完全可以在生产环境里安然自若地玩转 MySQL。记得:

  • S vs X:共享能共读,不共享只能独占;别忘了 MVCC 能让 X 锁下仍然读取旧版本。
  • \
  • I‑Locks:DML 前先搞好意向标记,否则全局 DDL 会卡住整个库。
  • \
  • K‑Locks: 是防幻读神器, 但也会导致 Insert 卡顿,需要权衡使用范围查询或唯一索引。
  • \

*温馨提示*: 在生产环境中调低事务隔离等级或随意关闭 gap lock, 会导致数据完整性风险,请三思而后行!祝各位 DBA 夜以继日、代码永无 BUG~ 🎉🧨📈,一言难尽。