检测锁定的表(通过 LOCK TABLE 锁定)

在 MySQL 中有没有检测锁定表的方法? 我指的是 LOCK TABLE table WRITE/READ命令锁定的表。

(注意,对检测用 GET_LOCK获得的 名字锁感兴趣的读者应该改为读取 显示 get _ lock 中的所有当前锁。)

261031 次浏览

这个 文章描述了如何获取关于被锁定的 MySQL 资源的信息。

您可以使用 GET _ LOCK (lockName,timeOut)创建自己的锁

如果在锁定表之前执行一个超时0的 GET_LOCK(lockName, 0),然后再执行一个 RELEASE_LOCK(lockName),那么执行 GET_LOCK()的所有其他线程将得到一个值0,这将告诉他们锁被另一个线程持有。

但是,如果在锁定表之前没有调用 GET_LOCK()的所有线程,那么这种方法就不起作用。锁定表的文档是 给你

希望能帮上忙!

您可以使用 SHOW OPEN TABLES来显示每个表的锁状态。

SHOW OPEN TABLES显示每个表的状态及其锁。

有关命名锁,请参见 显示 get _ lock 中的所有当前锁

使用 SHOW OPEN TABLES: Http://dev.mysql.com/doc/refman/5.1/en/show-open-tables.html

你可以这么做

SHOW OPEN TABLES WHERE `Table` LIKE '%[TABLE_NAME]%' AND `Database` LIKE '[DBNAME]' AND In_use > 0;

检查数据库中任何锁定的表。

最简单的方法是:

SHOW OPEN TABLES WHERE In_use > 0

只能获取当前数据库的锁定表。

您还可以从 Performance _ schema 获得所有相关细节:

SELECT
OBJECT_SCHEMA
,OBJECT_NAME
,GROUP_CONCAT(DISTINCT EXTERNAL_LOCK)
FROM performance_schema.table_handles
WHERE EXTERNAL_LOCK IS NOT NULL


GROUP BY
OBJECT_SCHEMA
,OBJECT_NAME

工作原理类似于

show open tables WHERE In_use > 0

以下是 Eric Leschinki于2014/15年度在 https://stackoverflow.com/a/26743484/1709587(现已删除)的回复:

关于如何检测锁定表的迷你演练:

这可能会阻止数据库在受影响的表和行中实施原子性。锁的设计是为了确保事情保持一致,这个过程将防止这个过程按照设计发生。

创建表,插入一些行

create table penguins(spam int, ham int);
insert into penguins(spam, ham) values (3, 4);

展示开放式桌子:

show open tables like "penguins"

印刷品:

your_database penguins    0   0

企鹅没有上锁,我们把它锁起来:

LOCK TABLES penguins READ;

检查一下是否锁住了:

show open tables like "penguins"

印刷品:

your_database, penguins 1, 0

啊哈! 锁上了! 让我们打开它:

unlock tables

现在它解锁了:

show open tables like "penguins"

印刷品:

your_database penguins    0   0

显示所有当前锁

show open tables where in_use <> 0

如果 MySQL 开发人员将这些信息放在一个常规表中(这样我就可以做一个 select my_items from my_table where my_clauses) ,而不是从系统变量中剥离出“ show table”语法,那将会更有帮助。