等待表元数据锁
今天,我们将学习等待表元数据锁定
。本文重点介绍了元数据锁定等待的原因并提供了解决方案。
MySQL 中的锁是什么
锁是一种与表关联的机制,用于限制对表数据的未授权访问。MySQL 还允许表锁定以避免在特定时间段内对同一表进行未经授权的更新。
请参阅以下信息图,其中 用户 A
更新记录并设置 SALARY = SALARY + 500
。同时,当 User A
更新记录时,User B
访问 Employee
表并检索尚未更新的 SALARY
。
为了避免这种情况,用户会锁定(READ
锁或 WRITE
锁)表,这会使其他用户处于等待状态。等待列表中的用户会收到等待表元数据锁定
的消息。
MySQL 中的元数据锁等待是什么
表上的元数据锁限制了对表结构的任何更改。在这种锁定机制中,在事务完成之前,任何其他会话都无法在数据定义语言语句中访问会话中的事务访问且仍在进程中的表。
当有活动事务时,请求数据写入的会话将被置于元数据锁定等待状态。
在 MySQL 中什么时候出现 Waiting for table metadata lock
当我们 DELETE
或 CREATE
索引并修改表的结构时,可能会发生 Waiting for table metadata lock
。
当我们对表执行维护操作、DELETE
表或尝试访问表级别的 WRITE
锁(使用此查询 LOCK TABLE table_name WRITE;
)时,也会发生这种情况。
导致元数据锁等待的活动事务
不同类型的活动事务可能导致元数据锁定等待。下面列出了一些可能发生元数据锁定等待的情况。
- 查询一个已经存在很长时间的表。
- 未能
COMMIT
或ROLLBACK
隐式或显式打开的事务。 - 当我们对一个表有一个不成功的查询事务时。
如何识别和解决 Waiting for table metadata lock
我们可以使用以下命令以表格形式获取必要的信息,显示等待表元数据锁定
发生的位置。
命令:
mysql> show processlist;
输出:
我们可以使用下面的查询,检查 TRANSACTIONS
部分以进行进一步调查,并检查哪个事务放置在 Waiting for table metadata lock
中。
命令:
SHOW ENGINE INNODB STATUS;
TRANSACTIONS
部分在线程 189 中存在问题,该线程处于空闲状态并让事务处于运行状态;见下文。
元数据锁应该通过杀死这个线程来释放,如下所示。
KILL 189;
请记住,无论何时发生元数据锁定等待,它都会阻止所有后续尝试访问该表的查询(请求)。这种情况会导致连接拥塞并影响公司。