迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > MySQL >

等待表元数据锁

作者:迹忆客 最近更新:2024/03/26 浏览次数:

今天,我们将学习等待表元数据锁定。本文重点介绍了元数据锁定等待的原因并提供了解决方案。


MySQL 中的锁是什么

锁是一种与表关联的机制,用于限制对表数据的未授权访问。MySQL 还允许表锁定以避免在特定时间段内对同一表进行未经授权的更新。

请参阅以下信息图,其中 用户 A 更新记录并设置 SALARY = SALARY + 500。同时,当 User A 更新记录时,User B 访问 Employee 表并检索尚未更新的 SALARY

为了避免这种情况,用户会锁定(READ 锁或 WRITE 锁)表,这会使其他用户处于等待状态。等待列表中的用户会收到等待表元数据锁定的消息。


MySQL 中的元数据锁等待是什么

表上的元数据锁限制了对表结构的任何更改。在这种锁定机制中,在事务完成之前,任何其他会话都无法在数据定义语言语句中访问会话中的事务访问且仍在进程中的表。

当有活动事务时,请求数据写入的会话将被置于元数据锁定等待状态。


在 MySQL 中什么时候出现 Waiting for table metadata lock

当我们 DELETECREATE 索引并修改表的结构时,可能会发生 Waiting for table metadata lock

当我们对表执行维护操作、DELETE 表或尝试访问表级别的 WRITE 锁(使用此查询 LOCK TABLE table_name WRITE;)时,也会发生这种情况。

导致元数据锁等待的活动事务

不同类型的活动事务可能导致元数据锁定等待。下面列出了一些可能发生元数据锁定等待的情况。

  1. 查询一个已经存在很长时间的表。
  2. 未能 COMMITROLLBACK 隐式或显式打开的事务。
  3. 当我们对一个表有一个不成功的查询事务时。

如何识别和解决 Waiting for table metadata lock

我们可以使用以下命令以表格形式获取必要的信息,显示等待表元数据锁定发生的位置。

命令:

mysql> show processlist;

输出:

我们可以使用下面的查询,检查 TRANSACTIONS 部分以进行进一步调查,并检查哪个事务放置在 Waiting for table metadata lock 中。

命令:

SHOW ENGINE INNODB STATUS;

TRANSACTIONS 部分在线程 189 中存在问题,该线程处于空闲状态并让事务处于运行状态;见下文。

元数据锁应该通过杀死这个线程来释放,如下所示。

KILL 189;

请记住,无论何时发生元数据锁定等待,它都会阻止所有后续尝试访问该表的查询(请求)。这种情况会导致连接拥塞并影响公司。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 MySQL 中声明和使用变量

发布时间:2024/03/26 浏览次数:102 分类:MySQL

当你需要在 MySQL 中的脚本中存储单个值时,最好的方法是使用变量。变量有不同的种类,有必要知道何时以及如何使用每种类型。

在 MySQL 中实现刷新权限

发布时间:2024/03/26 浏览次数:179 分类:MySQL

本教程介绍了 MySQL 中的刷新权限命令,用于刷新授权表并影响允许的更改。

在 MySQL 中设置时区

发布时间:2024/03/26 浏览次数:86 分类:MySQL

在本教程中,我们将学习如何在 MySQL 服务器中更改时区。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便