有没有办法检测MySQL中的锁定表?我的意思是由LOCK TABLE table WRITE/READ
命令锁定的表。
(请注意,有兴趣检测使用GET_LOCK
获取的命名锁定的读者应该阅读Show all current locks from get_lock。)
答案 0 :(得分:54)
使用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;
检查数据库中的任何锁定表。
答案 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
),而不是从系统变量中删除“显示表”语法,那将大有帮助。