主题
面试速答(先看这里)
**一句话结论:**字典锁,英文名叫做MetaData Lock,也叫做MDL锁,它是一种用于管理元数据的锁机制,而不是数据本身的锁。
60秒标准回答:
字典锁,英文名叫做MetaData Lock,也叫做MDL锁,它是一种用于管理元数据的锁机制,而不是数据本身的锁
MDL锁用于控制对数据库对象的元数据的并发访问,数据库会在执行DDL(Data Defination Language)操作时加上字典锁。字典锁的主要目的是保护数据库中的元数据对象,如表、列、索引、视图等,以确保在DDL操作期间,不会出现数据一致性问题和竞争条件
以下是触发数据库加字典锁的一些情况
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**MDL锁用于控制对数据库对象的元数据的并发访问,数据库会在执行DDL(Data Defination Language)操作时加上字典锁。
- **要点2:**在数据库中,通常有两种主要的锁级别,即共享锁和排他锁,而字典锁也有两种级别,即:
- **要点3:**而在字典锁的加锁过程中,会有升级的情况,当事务开始时,通常会以 共享字典锁 的方式访问元数据对象。
- **要点4:**如果事务需要对元数据对象进行修改操作,例如修改表结构或索引,它需要将共享字典锁 升级 为 排他字典锁 ,以阻止其他事务同时访问该元数据对象。
- **要点5:**在数据库管理系统中,升级通常是自动执行的。
**记忆锚点:**DDL → TABLE → 共享字典锁 → 排他字典锁 → ALTER → CREATE
加分表达:
- 修改列定义 :如果执行ALTER TABLE来修改表的列定义,例如改变数据类型、添加、删除、重命名列等,相关的列和表的元数据会被锁定。
- 如果事务需要对元数据对象进行修改操作,例如修改表结构或索引,它需要将共享字典锁 升级 为 排他字典锁 ,以阻止其他事务同时访问该元数据对象。
追问准备:
- 围绕「DDL」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「TABLE」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「共享字典锁」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
字典锁,英文名叫做MetaData Lock,也叫做MDL锁,它是一种用于管理元数据的锁机制,而不是数据本身的锁。
MDL锁用于控制对数据库对象的元数据的并发访问,数据库会在执行DDL(Data Defination Language)操作时加上字典锁。字典锁的主要目的是保护数据库中的元数据对象,如表、列、索引、视图等,以确保在DDL操作期间,不会出现数据一致性问题和竞争条件。
以下是触发数据库加字典锁的一些情况:
- 创建/修改/删除表结构:当执行CREATE TABLE、ALTER TABLE、DROP TABLE等DDL语句时,数据库会对相关的表和表的元数据对象加上字典锁,以阻止其他事务同时修改这些表的结构。
- 创建/修改/删除索引:执行CREATE INDEX、ALTER TABLE 添加索引、修改、删除索引等DDL操作时,会锁定与索引相关的元数据,以确保索引的一致性。
- 修改列定义:如果执行ALTER TABLE来修改表的列定义,例如改变数据类型、添加、删除、重命名列等,相关的列和表的元数据会被锁定。
- 创建/修改/删除视图:当执行CREATE VIEW、ALTER VIEW、DROP VIEW等DDL操作以创建或修改视图时,相关视图的元数据会被锁定。
- 其他DDL操作:其他的DDL操作,如创建、修改、删除存储过程、触发器、事件等也可能涉及到元数据的锁定。
扩展知识
字典锁升级
在数据库中,通常有两种主要的锁级别,即共享锁和排他锁,而字典锁也有两种级别,即:
共享字典锁(SHARED-MDL ):这允许多个事务同时读取元数据对象,但不允许任何事务修改它们。共享字典锁通常用于保护元数据的读取操作,以确保在读取元数据时不会被其他事务修改。
排他字典锁(EXCLUSIVE-MDL ):排他字典锁是最高级别的字典锁,它阻止其他事务同时读取或修改元数据对象。只有一个事务可以持有排他字典锁,通常用于保护元数据的写操作,以确保数据的完整性。
而在字典锁的加锁过程中,会有升级的情况,当事务开始时,通常会以共享字典锁的方式访问元数据对象。这允许多个事务同时读取相同的元数据。
如果事务需要对元数据对象进行修改操作,例如修改表结构或索引,它需要将共享字典锁升级为排他字典锁,以阻止其他事务同时访问该元数据对象。
在数据库管理系统中,升级通常是自动执行的。当事务尝试修改元数据对象时,系统会检测到需要升级共享字典锁为排他字典锁,以确保数据的完整性。