← 每日面试题 学习看板

MySQL中字典锁是什么?

面试题/03数据库中间件/01MySQL/02InnoDB核心原理(存储引擎-数据结构)/MySQL中字典锁是什么?.md

面试记录 2026-10-13

题目:MySQL中字典锁是什么?

难度:low

标签:db/mysql/innodb, mysql/innodb, difficulty/low

评分:⭐⭐☆☆☆(2/5)

我的回答

字典锁主要是用来保证数据字典的一个线程安全,在访问数据字典的时候会进行加锁操作。

保证数据字典的一个安全,就是数据字典。数据字典是在内存里面,然后每次的访问的时候,都要加锁,就避免一个并发的一个访问导致的一些错误。

所以数据字典在表上操作的时候,要加锁。因为数据字典在表锁的时候,所以就是表上,所以加锁。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:考察是否清楚 InnoDB 内部锁 vs MySQL Server 层锁的层级差异,避免混淆。

知识点拆解:

  1. 数据字典(Data Dictionary)本身
  1. InnoDB 字典锁(data dictionary latch)
  1. MDL(Metadata Lock)—— 常被混淆
  1. 其他可能混淆的锁
  1. 面试应对策略

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 长事务阻塞 DDL 怎么排查和解决?
  1. InnoDB 8.0 数据字典做了哪些优化?
  1. 意向锁和 MDL 的关系?

第三部分:面试者参考回答(口语化)

面试官您好,字典锁这个词其实要分两种理解,我先说清楚差异。

第一种是 InnoDB 内部的 data dictionary lock。这是存储引擎内部实现细节,本质是 C++ 层的 mutex 或 rw-lock,业务层完全感知不到,也控制不了。它保护的是内存中的 data dictionary 缓存——里面存着表元信息、索引元信息、页描述符、事务系统这些结构。MySQL 8.0 之前粒度比较粗,基本是一把大字典锁保护整个 dd cache;8.0 之后拆成了更细粒度的锁,比如表级、索引级、页级各自一把,并发争用大幅下降。这个字典锁面试里主要是讲清"它是内部实现,不是 SQL 语义"就够了。

第二种是常被混淆的 MDL(Metadata Lock)。这个是 MySQL Server 层的元数据锁,performance_schema.metadata_locks 里可见。规则是 DML 拿共享 MDL、DDL 拿排他 MDL。生产上最容易出的事故是——有个长事务持共享 MDL 没提交,后续想 ALTER TABLE 就会一直等,把整个库的连接池占满。排查就三步:先跑 SELECT FROM performance_schema.metadata_locks 看锁等待链,再跑 SELECT FROM information_schema.innodb_trx 找长事务,最后 kill 掉那个长事务。8.0 之后可以调 metadata_locks_timeout 加超时兜底,避免永久阻塞。

所以面试官如果问"字典锁",我会先反问清一下具体指哪个。如果指 InnoDB 内部的,就讲保护对象和粒度演进;如果指 MDL,就重点讲长事务阻塞 DDL 的排查套路——这是我实际线上踩过最多次的坑。


面试记录 2026-10-13(第 2 次)

题目:MySQL中字典锁是什么?

难度:low

标签:db/mysql/innodb, mysql/innodb, difficulty/low

评分:⭐⭐⭐☆☆(3/5)

练习次数:2

我的回答

字典锁指的应该是 MySQL 数据库更新数据字典,比如它的索引、它的表结构、增减字段之类的操作。

当发生字典锁的时候,应该会锁整张表。如果是类似于结构的重建,应该会锁整张表。比如当我们加索引的时候,大表加索引会导致整张表无法进行正常的查询、插入等操作,这就是字典锁的一个体现。

所以线上尽量不可能,不要对大表进行 MDL 操作,不要更新它的表结构,不要加在峰值的时候加索引。要加的话,尽量选择平缓时段,业务量没那么大的时段,以及选择可以先建新表,再进行修改表名。然后进行更新的操作。

点评

优点:

不足:

补充:

ℹ️ 完整讲解见上方首次记录(2026-10-13)