什么是Mysql表元数据锁定等待队列排序

马修

我有一堆连接在一个事务中执行SELECT,另一个执行DDL。mysql手册非常清楚有关如何在事务内获取元数据锁:

为了确保事务的可序列化性,服务器不得允许一个会话对另一个会话中未完成的显式或隐式启动的事务中使用的表执行数据定义语言(DDL)语句。服务器通过获取事务中使用的表上的元数据锁并将这些锁的释放推迟到事务结束之前来实现。表上的元数据锁可防止更改表的结构。这种锁定方法的含义是,在一个事务内的事务正在使用的表在事务结束之前不能在其他会话的DDL语句中使用。

这很有道理,所以我做了这个测试:

connectionA$ begin;
connectionA$ select * from facebook_authorizations;
connectionA$ ....
connectionB$ alter table facebook_authorizations add column foo int default null;
connectionC$ begin;
connectionC$ select * from facebook_authorizations;
connectionA$ commit;

在我的系统上,当connectionA提交时,connectionC执行,而connectionB仍然挂起:它使基于SELECT的转换无法执行。我期望元数据锁定等待列表大致按FIFO顺序进行处理,但事实并非如此。

是否有关于元数据等待队列处理顺序的文档?

阿尔法马克

有关方案的详细信息:

尝试重现这种情况,我阻止了会话B,然后阻止了会话C。请注意,如果会话B实际上在获取表上的元数据锁之前正在等待其他事件,则会话C没有理由等待。

现在,一般而言:

已经授予的元数据锁performance_schema在表中metadata_locksLOCK_STATUSas中可见GRANTED

参见文档:https : //dev.mysql.com/doc/refman/8.0/en/metadata-locks-table.html

这有助于查看哪个会话拥有哪个锁。

会话正在等待的元数据锁在同一表中也可见,用LOCK_STATUSas表示PENDING

这有助于查看会话正在等待什么

一个(阻塞的)会话等待某个东西的锁定,而该锁定又可能已被其他会话锁定(具有LOCK_TYPELOCK_DURATION),但是这里没有直接的“会话X等待会话Y”关系,这暗示着该锁定已经到位。

当多个会话都在等待相同的资源时,并且当该资源可用时(一个会话释放了元数据锁),尝试预期处理顺序(在我看来)是有风险的,并且应用程序逻辑不应依赖于此:据我所知,当前的实现确实是一个FIFO,但这可能随时更改,没有记录在案。

这里的合理性是服务器必须具有一定程度的自由度,以便例如出于性能原因而实施不同的调度策略是可行的。如果某种应用程序以某种方式“期望”给定的顺序,它将中断并阻止任何更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MySQL Dump等待表元数据锁定

如何在TRUNCATE TABLE上解决MySQL Innodb“等待表元数据锁定”?

MariaDB InnoDB表:如何查找导致“等待表元数据锁定”的语句

如何找到哪个事务导致“等待表元数据锁定”状态?

MySQL 5.7上的元数据锁定,找不到锁定过程?

找出什么锁定了MySQL InnoDB表行

如何在MySQL 5.5.x的单独表中基于元数据对主表进行排序?

Linux等待队列...排序重要吗?

Laravel 5.5 基于 MySQL 的“队列”在高请求量时锁定数据库

锁定“本地” MySQL表

在MySQL中锁定表

如果表具有相同的数据,mysql中的排序顺序是什么?

MySQL从表中对数据进行排序

尝试更新MySQL条目时,为什么会收到“超过了“锁定等待超时””错误?

PyMongo排序与元数据

为什么Azure Logic“当在队列中接收到消息时(窥视锁定)”“下一个可用”等待这么长时间才能接收到队列消息?

MySQL-表“ my_table”未用锁定表锁定

从MySQL的两个表中获取数据并排序

为什么 postgreSQL 在执行真空全表时等待?4T表数据

为什么我的Azure SQL数据库表被永久锁定?

jQuery排序表数据

有什么办法显示MySQL表锁定历史记录

当 mysql(innoDB) 表被更改(锁定)时,插入会发生什么?

线程的等待队列在POSIX pthread互斥锁锁定和解锁中位于何处?

防止在不锁定表的情况下在MySQL中同时进行数据库更新

为什么异步队列等待get()阻塞?

mysql.connector.errors.DatabaseError:1205锁定等待超时

MySQL插入锁定等待超时超过-自动递增

锁定表的SQL命令是什么?