题目:MySQL中字典锁是什么?
难度:low
标签:db/mysql/innodb, mysql/innodb, difficulty/low
评分:⭐⭐☆☆☆(2/5)
字典锁主要是用来保证数据字典的一个线程安全,在访问数据字典的时候会进行加锁操作。
保证数据字典的一个安全,就是数据字典。数据字典是在内存里面,然后每次的访问的时候,都要加锁,就避免一个并发的一个访问导致的一些错误。
所以数据字典在表上操作的时候,要加锁。因为数据字典在表锁的时候,所以就是表上,所以加锁。
优点:
不足:
LOCK TABLES / 表级行锁无关。回答后半段"数据字典在表锁的时候"表述混乱SHOW OPEN TABLES 里能看到),DDL 与 DML 冲突时会拿 MDL 死锁等待;字典锁是 InnoDB 存储引擎内部的东西,两者完全不是一回事.frm 文件,8.0 起存到数据字典表(mysql.* 系统表)里,并缓存在内存 data_dictionary 缓存中补充:
SELECT 拿共享 MDL,DDL 拿排他 MDL;长事务持 MDL 会阻塞后续 DDL(生产事故高发点)performance_schema.metadata_locks)核心考点定位:考察是否清楚 InnoDB 内部锁 vs MySQL Server 层锁的层级差异,避免混淆。
知识点拆解:
.frm 文件 + .ibd + 部分在系统表.frm 文件为主mysql. 数据字典表(dd_),并加 data_dictionary 内存缓存performance_schema.metadata_locks 可见ALTER TABLE 一直等)performance_schema.metadata_locks、information_schema.innodb_trx 找长事务metadata_locks_timeout 参数(8.0)、kill 长事务、DDL 用 ALGORITHM=INPLACE LOCK=NONELOCK TABLES,DML 显式锁,业务可见考察方向:
延伸递进面试题:
SELECT * FROM performance_schema.metadata_locks 看锁等待;innodb_trx 找长事务;metadata_locks_timeout 加超时;kill 长事务.frm 迁到数据字典表,内存缓存 + 细粒度锁拆分,DDL 并发能力大幅提升面试官您好,字典锁这个词其实要分两种理解,我先说清楚差异。
第一种是 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 的排查套路——这是我实际线上踩过最多次的坑。
题目:MySQL中字典锁是什么?
难度:low
标签:db/mysql/innodb, mysql/innodb, difficulty/low
评分:⭐⭐⭐☆☆(3/5)
练习次数:2
字典锁指的应该是 MySQL 数据库更新数据字典,比如它的索引、它的表结构、增减字段之类的操作。
当发生字典锁的时候,应该会锁整张表。如果是类似于结构的重建,应该会锁整张表。比如当我们加索引的时候,大表加索引会导致整张表无法进行正常的查询、插入等操作,这就是字典锁的一个体现。
所以线上尽量不可能,不要对大表进行 MDL 操作,不要更新它的表结构,不要加在峰值的时候加索引。要加的话,尽量选择平缓时段,业务量没那么大的时段,以及选择可以先建新表,再进行修改表名。然后进行更新的操作。
优点:
不足:
.frm / dd 表 / 内存缓存三阶段演进未提ALGORITHM=INPLACE LOCK=NONE(MySQL 5.6+ 支持)、pt-online-schema-change / gh-ost(大厂标配)、MySQL 8.0 的 Instant DDLperformance_schema.metadata_locks、information_schema.innodb_trx补充:
ALGORITHM=INPLACE, LOCK=NONE(5.6+,多数 ALTER 支持)pt-online-schema-change(Percona Toolkit)gh-ost(GitHub 开源,Facebook 生产方案)SELECT * FROM performance_schema.metadata_locks + innodb_trx 找长事务ℹ️ 完整讲解见上方首次记录(2026-10-13)