在 MySQL 中有没有检测锁定表的方法? 我指的是 LOCK TABLE table WRITE/READ命令锁定的表。
LOCK TABLE table WRITE/READ
(注意,对检测用 GET_LOCK获得的 名字锁感兴趣的读者应该改为读取 显示 get _ lock 中的所有当前锁。)
GET_LOCK
这个 文章描述了如何获取关于被锁定的 MySQL 资源的信息。
您可以使用 GET _ LOCK (lockName,timeOut)创建自己的锁
如果在锁定表之前执行一个超时0的 GET_LOCK(lockName, 0),然后再执行一个 RELEASE_LOCK(lockName),那么执行 GET_LOCK()的所有其他线程将得到一个值0,这将告诉他们锁被另一个线程持有。
GET_LOCK(lockName, 0)
RELEASE_LOCK(lockName)
GET_LOCK()
但是,如果在锁定表之前没有调用 GET_LOCK()的所有线程,那么这种方法就不起作用。锁定表的文档是 给你
希望能帮上忙!
您可以使用 SHOW OPEN TABLES来显示每个表的锁状态。
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”语法,那将会更有帮助。
这可能会阻止数据库在受影响的表和行中实施原子性。锁的设计是为了确保事情保持一致,这个过程将防止这个过程按照设计发生。
创建表,插入一些行
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;
检查一下是否锁住了:
your_database, penguins 1, 0
啊哈! 锁上了! 让我们打开它:
unlock tables
现在它解锁了:
show open tables where in_use <> 0
如果 MySQL 开发人员将这些信息放在一个常规表中(这样我就可以做一个 select my_items from my_table where my_clauses) ,而不是从系统变量中剥离出“ show table”语法,那将会更有帮助。
select my_items from my_table where my_clauses