以下操作会产生元数据锁(MDL),阻塞读写业务的有?
A. 长时间执行 ALTER TABLE 改表结构
B. 批量创建、删除数据表
C. 在线重命名数据表
D. 普通条件查询语句
1 个赞
正确答案是 A、B、C 。
详细解析:
元数据锁(Metadata Lock,简称 MDL)主要用于保证 DDL(数据定义语言)与 DML(数据操纵语言)之间,以及 DDL 与 DDL 之间的并发安全性。当操作需要修改或读取表结构时,就会涉及元数据锁。
-
选项 A (长时间执行 ALTER TABLE 改表结构) 正确 :
ALTER TABLE属于典型的 DDL 操作。在执行此类操作时,数据库通常需要获取MDL_EXCLUSIVE(排他锁)来修改表的元数据。如果该操作耗时较长,会阻塞其他所有试图访问该表的 DML 读写操作(表现为Waiting for table metadata lock)4。 -
选项 B (批量创建、删除数据表) 正确 :
CREATE TABLE和DROP TABLE均属于 DDL 操作。在创建或删除表时,系统需要更新系统内部的元数据表(如__all_table、__all_column等),这一过程必然需要获取元数据锁,从而可能对并发业务产生阻塞4。 -
选项 C (在线重命名数据表) 正确 :
RENAME TABLE属于 DDL 操作。在执行表重命名的过程中,系统会自动锁定该过程,阻止任何其他线程对这些表进行读取或写入操作,直到重命名完成。如果目标表上存在持续的活跃事务,重命名操作将会等待,反之也会阻塞其他业务9。 -
选项 D (普通条件查询语句) 错误 :
普通的SELECT查询属于 DML 操作。在执行普通查询时,数据库通常只需要获取MDL_SHARED_READ类型的锁。这种锁与普通的读写操作是相互兼容的,不会阻塞正常的业务读写,也不会被普通的读写操作阻塞。
1 个赞
正确答案是 A、B、C 。
解析:
元数据锁(MDL,Metadata Lock)主要用于保证数据库对象(如表结构、表名等)的元数据在并发操作下的安全性与一致性。普通的读写事务需要获取 MDL 读锁,而 DDL 操作需要获取 MDL 写锁(排他锁)。
-
A. 长时间执行 ALTER TABLE 改表结构(正确) :执行
ALTER TABLE等 DDL 语句时,数据库需要获取 MDL 写锁来修改表的元数据。如果该操作耗时较长,或者在获取锁的过程中遇到长事务阻塞,会导致 MDL 锁堆积,进而阻塞后续针对该表的所有读写业务。 -
B. 批量创建、删除数据表(正确) :
CREATE TABLE和DROP TABLE属于 DDL 操作,在执行过程中必须获取 MDL 排他锁以保证元数据变更的原子性和一致性。批量执行时会持续持有该锁,从而阻塞其他会话对该表的访问。 -
C. 在线重命名数据表(正确) :执行
RENAME TABLE语句时,系统需要修改表的元数据。为了保证变更的原子性,系统会自动锁定该过程,阻止其他线程对这些表进行读取操作,直到重命名完成。 -
D. 普通条件查询语句(错误) :普通的
SELECT查询语句只需要获取 MDL 读锁(如MDL_SHARED_READ)。多个读锁之间是相互兼容的,因此普通查询不会阻塞其他普通的读写业务。
1 个赞
A、B、C 。
1 个赞