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

时间:2010-03-23 12:55:01

标签: mysql locking

有没有办法检测MySQL中的锁定表?我的意思是由LOCK TABLE table WRITE/READ命令锁定的表。

(请注意,有兴趣检测使用GET_LOCK获取的命名锁定的读者应该阅读Show all current locks from get_lock。)

8 个答案:

答案 0 :(得分:54)

使用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;

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

答案 1 :(得分:44)

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

答案 2 :(得分:17)

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

对于命名锁,请查看Show all current locks from get_lock

答案 3 :(得分:5)

最简单的方法是:

SHOW OPEN TABLES WHERE In_use > 0

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

答案 4 :(得分:4)

您可以使用GET_LOCK(lockName,timeOut)

创建自己的锁

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

但是,如果在锁定表之前没有所有线程调用GET_LOCK(),则无效。锁定表的文档是here

希望有所帮助!

答案 5 :(得分:2)

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

答案 6 :(得分: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

答案 7 :(得分: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),而不是从系统变量中删除“显示表”语法,那将大有帮助。