首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >显示get_lock中的所有当前锁定

显示get_lock中的所有当前锁定
EN

Stack Overflow用户
提问于 2012-06-14 21:46:34
回答 6查看 185.8K关注 0票数 64

有没有办法选择/显示使用GET_LOCK function取出的所有当前锁

请注意,GET_LOCK锁不同于表锁,就像那些使用LOCK TABLES获取的锁一样-想知道如何查看这些锁的读者应该阅读Detecting locked tables (locked by LOCK TABLE)

EN

回答 6

Stack Overflow用户

发布于 2017-02-21 08:02:12

从MySQL 5.7开始,这是可能的,但需要先在performance_schema.setup_instruments表中启用mdl仪器。您可以通过运行以下命令临时执行此操作(直到服务器下次重新启动):

UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';

或者永久地,通过将以下咒语添加到my.cnf文件的[mysqld]部分(或MySQL从安装中读取的任何配置文件):

[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'

(如果采用后一种方法,自然需要重新启动MySQL以使配置更改生效。)

通过对performance_schema.metadata_locks表运行SELECT,可以查看在启用mdl仪器后取出的锁。正如文档中所指出的,GET_LOCK锁的OBJECT_TYPE'USER LEVEL LOCK',因此我们可以使用WHERE子句将查询过滤到它们:

mysql> SELECT GET_LOCK('foobarbaz', -1);
+---------------------------+
| GET_LOCK('foobarbaz', -1) |
+---------------------------+
|                         1 |
+---------------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM performance_schema.metadata_locks 
    -> WHERE OBJECT_TYPE='USER LEVEL LOCK'
    -> \G
*************************** 1. row ***************************
          OBJECT_TYPE: USER LEVEL LOCK
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: foobarbaz
OBJECT_INSTANCE_BEGIN: 139872119610944
            LOCK_TYPE: EXCLUSIVE
        LOCK_DURATION: EXPLICIT
          LOCK_STATUS: GRANTED
               SOURCE: item_func.cc:5482
      OWNER_THREAD_ID: 35
       OWNER_EVENT_ID: 3
1 row in set (0.00 sec)

mysql> 

https://dev.mysql.com/doc/refman/en/metadata-locks-table.html中,这个结果中列的含义大部分都有充分的文档记录,但是有一点混淆值得注意:OWNER_THREAD_ID列不包含持有锁的线程的连接ID (就像在PROCESSLIST中显示或由CONNECTION_ID()返回的ID一样)。令人困惑的是,术语“线程ID”有时在MySQL文档中用作“连接ID”的同义词,但这不是其中之一。如果希望确定持有锁的连接的连接ID (例如,为了使用KILL终止该连接),则需要在performance_schema.threads表中查找与THREAD_ID对应的PROCESSLIST_ID。例如,要杀死持有我的锁的连接...

mysql> SELECT OWNER_THREAD_ID FROM performance_schema.metadata_locks
    -> WHERE OBJECT_TYPE='USER LEVEL LOCK'
    -> AND OBJECT_NAME='foobarbaz';
+-----------------+
| OWNER_THREAD_ID |
+-----------------+
|              35 |
+-----------------+
1 row in set (0.00 sec)

mysql> SELECT PROCESSLIST_ID FROM performance_schema.threads
    -> WHERE THREAD_ID=35;
+----------------+
| PROCESSLIST_ID |
+----------------+
|             10 |
+----------------+
1 row in set (0.00 sec)

mysql> KILL 10;
Query OK, 0 rows affected (0.00 sec)
票数 24
EN

Stack Overflow用户

发布于 2015-05-01 04:40:31

从MySQL 5.7开始,性能模式公开所有元数据锁,包括与GET_LOCK()函数相关的锁。

请参阅http://dev.mysql.com/doc/refman/5.7/en/metadata-locks-table.html

票数 22
EN

Stack Overflow用户

发布于 2012-07-11 23:43:01

SHOW FULL PROCESSLIST;

你会看到里面的锁

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11034504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档