以下操作会产生元数据锁(MDL),阻塞读写业务的有?

以下操作会产生元数据锁(MDL),阻塞读写业务的有?
A. 长时间执行 ALTER TABLE 改表结构
B. 批量创建、删除数据表
C. 在线重命名数据表
D. 普通条件查询语句

1 个赞

正确答案是 A、B、C

详细解析:

元数据锁(Metadata Lock,简称 MDL)主要用于保证 DDL(数据定义语言)与 DML(数据操纵语言)之间,以及 DDL 与 DDL 之间的并发安全性。当操作需要修改或读取表结构时,就会涉及元数据锁。

  • :white_check_mark: 选项 A (长时间执行 ALTER TABLE 改表结构) 正确
    ALTER TABLE 属于典型的 DDL 操作。在执行此类操作时,数据库通常需要获取 MDL_EXCLUSIVE (排他锁)来修改表的元数据。如果该操作耗时较长,会阻塞其他所有试图访问该表的 DML 读写操作(表现为 Waiting for table metadata lock )4。
  • :white_check_mark: 选项 B (批量创建、删除数据表) 正确
    CREATE TABLEDROP TABLE 均属于 DDL 操作。在创建或删除表时,系统需要更新系统内部的元数据表(如 __all_table__all_column 等),这一过程必然需要获取元数据锁,从而可能对并发业务产生阻塞4。
  • :white_check_mark: 选项 C (在线重命名数据表) 正确
    RENAME TABLE 属于 DDL 操作。在执行表重命名的过程中,系统会自动锁定该过程,阻止任何其他线程对这些表进行读取或写入操作,直到重命名完成。如果目标表上存在持续的活跃事务,重命名操作将会等待,反之也会阻塞其他业务9。
  • :x: 选项 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 TABLEDROP TABLE 属于 DDL 操作,在执行过程中必须获取 MDL 排他锁以保证元数据变更的原子性和一致性。批量执行时会持续持有该锁,从而阻塞其他会话对该表的访问。
  • C. 在线重命名数据表(正确) :执行 RENAME TABLE 语句时,系统需要修改表的元数据。为了保证变更的原子性,系统会自动锁定该过程,阻止其他线程对这些表进行读取操作,直到重命名完成。
  • D. 普通条件查询语句(错误) :普通的 SELECT 查询语句只需要获取 MDL 读锁(如 MDL_SHARED_READ )。多个读锁之间是相互兼容的,因此普通查询不会阻塞其他普通的读写业务。
1 个赞

A、B、C

1 个赞