mysql 检测锁定的表(由LOCK TABLE锁定)

cx6n0qe3  于 2023-06-04  发布在  Mysql
关注(0)|答案(8)|浏览(525)

有没有办法在MySQL中检测锁定的表?我指的是由LOCK TABLE table WRITE/READ命令锁定的表。
(Note对检测GET_LOCK获取的 named 锁感兴趣的读者应该改为读取Show all current locks from get_lock。)

txu3uszq

txu3uszq1#

使用SHOW OPEN TABLEShttp://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;

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

mfuanj7w

mfuanj7w2#

您可以使用SHOW OPEN TABLES来显示每个表的锁状态。有关该命令文档页面的更多详细信息,请参见here

q3qa4bjr

q3qa4bjr3#

SHOW OPEN TABLES显示每个表的状态及其锁。
有关命名锁,请参见Show all current locks from get_lock

ao218c7q

ao218c7q4#

最简单的方法是:

SHOW OPEN TABLES WHERE In_use > 0

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

xe55xuns

xe55xuns5#

您可以使用GET_LOCK(lockName,timeOut)创建自己的锁
如果在锁定表之前执行GET_LOCK(lockName, 0),超时时间为0,然后执行RELEASE_LOCK(lockName),那么执行GET_LOCK()的所有其他线程将获得值0,这将告诉它们锁被另一个线程持有。
但是,如果没有让所有线程在锁定表之前调用GET_LOCK(),这将不起作用。锁定表的文档是here
希望有帮助!

qzlgjiam

qzlgjiam6#

您还可以从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
9rnv2umw

9rnv2umw7#

这个article描述了如何获取有关锁定的MySQL资源的信息。mysqladmin debug也可能有一些用处。

i34xakig

i34xakig8#

以下答案是由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

Penguins未锁定,让我们锁定它:

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”语法,那会更有帮助。

相关问题