Mysql 会话锁查看

本文详细介绍了如何在MySQL中查看会话锁,包括全局读锁的执行过程,以及不同版本中查看锁信息的方法。通过示例展示了在8.0和5.7版本中使用`performance_schema`和`information_schema`来检查锁的状态,包括`metadata_locks`、`data_locks`、`innodb_trx`等表的内容,以及如何解析锁数据和类型。同时,文章讨论了锁的类型如全局锁、表锁、行锁,以及锁等待和事务状态。
摘要由CSDN通过智能技术生成

Mysql锁查看

一、全局读锁
会话1执行全局读锁
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|              15 |
+-----------------+
1 row in set (0.00 sec)

mysql> flush table with read lock;
Query OK, 0 rows affected (0.01 sec)

mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|              15 |
+-----------------+
1 row in set (0.01 sec)

会话2执行普通DML 被堵塞
mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|              16 |
+-----------------+
1 row in set (0.00 sec)

mysql> insert into t values (0);

会话被堵塞


会话3

mysql> show processlist;
+----+-----------------+-----------------+------+---------+---------+----------------------------------------------------------+--------------------------+
| Id | User            | Host            | db   | Command | Time    | State                                                    | Info                     |
+----+-----------------+-----------------+------+---------+---------+----------------------------------------------------------+--------------------------+
|  5 | system user     | connecting host | NULL | Connect | 1245116 | Waiting for source to send event                         | NULL                     |
|  6 | event_scheduler | localhost       | NULL | Daemon  | 1245116 | Waiting on empty queue                                   | NULL                     |
|  9 | system user     |                 | NULL | Query   |   93709 | Replica has read all relay log; waiting for more updates | NULL                     |
| 10 | system user     |                 | NULL | Connect | 1245116 | Waiting for an event from Coordinator                    | NULL                     |
| 11 | system user     |                 | NULL | Connect | 1245116 | Waiting for an event from Coordinator                    | NULL                     |
| 12 | system user     |                 | NULL | Connect | 1245116 | Waiting for an event from Coordinator                    | NULL                     |
| 13 | system user     |                 | NULL | Connect | 1245116 | Waiting for an event from Coordinator                    | NULL                     |
| 15 | root            | localhost       | NULL | Sleep   |     363 |                                                          | NULL                     |
| 16 | root            | localhost       | test | Query   |     145 | Waiting for global read lock                             | insert into t values (0) |
| 17 | root            | localhost       | NULL | Query   |       0 | init                                                     | show processlist         |
+----+-----------------+-----------------+------+---------+---------+----------------------------------------------------------+--------------------------+
10 rows in set, 1 warning (0.00 sec)
会话16被state为Waiting for global read lock 表示正在等待全局锁


mysql> select connection_id();
+-----------------+
| connection_id() |
+-----------------+
|              17 |
+-----------------+
1 row in set (0.00 sec)

8.0版本
mysql> select * from performance_schema.data_locks;
Empty set (0.00 sec)

mysql> select * from performance_schema.data_lock_waits;
Empty set (0.00 sec)

mysql> select * from information_schema.innodb_trx\G
Empty set (0.01 sec)

显示都为空。

mysql> show engine innodb status\G

------------
TRANSACTIONS
------------
Trx id counter 5003852
Purge done for trx's n:o < 5003846 undo n:o < 0 state: running but idle
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421858852885232, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852884424, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852883616, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852882808, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852882000, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852881192, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852880384, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852879576, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852878768, not started
0 lock struct(s), heap size 1128, 0 row lock(s)
---TRANSACTION 421858852877960, not started
0 lock struct(s), heap size 1128, 0 row lock(s)


TRANSACTIONS 没有信息


5.7版本开始提供了performance_schema.metadata_locks表,该表记录了各种Server层的锁信息,performance_schema.data_locks 查看行锁和表锁

show create table performance_schema.metadata_locks
表结构如下:
mysql> show create table performance_schema.metadata_locks\G
*************************** 1. row ***************************
       Table: metadata_locks
Create Table: CREATE TABLE `metadata_locks` (
  `OBJECT_TYPE` varchar(64) NOT NULL,
  `OBJECT_SCHEMA` varchar(64) DEFAULT NULL,
  `OBJECT_NAME` varchar(64) DEFAULT NULL,
  `COLUMN_NAME` varchar(64) DEFAULT NULL,
  `OBJECT_INSTANCE_BEGIN` bigint unsigned NOT NULL,
  `LOCK_TYPE` varchar(32) NOT NULL,
  `LOCK_DURATION` varchar(32) NOT NULL,
  `LOCK_STATUS` varchar(32) NOT NULL,
  `SOURCE` varchar(64) DEFAULT NULL,
  `OWNER_THREAD_ID` bigint unsigned DEFAULT NULL,
  `OWNER_EVENT_ID` bigint unsigned DEFAULT NULL,
  PRIMARY KEY (`OBJECT_INSTANCE_BEGIN`),
  KEY `OBJECT_TYPE` (`OBJECT_TYPE`,`OBJECT_SCHEMA`,`OBJECT_NAME`,`COLUMN_NAME`),
  KEY `OWNER_THREAD_ID` (`OWNER_THREAD_ID`,`OWNER_EVENT_ID`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

OBJECT_TYPE值有
GLOBAL, SCHEMA, TABLE, FUNCTION, PROCEDURE, TRIGGER (currently unused), 
EVENT, COMMIT, USER LEVEL LOCK, TABLESPACE, or LOCKING SERVICE.

LOCK_STATUS解读
LOCK_STATUS    是否瞬时状态    备注
PENDING         否                请求锁但没有获得锁定
GRANTED         否                请求且已获得锁定
VICTIM         是                当死锁检测器取消挂起的锁定请求以打破死锁(ER_LOCK_DEADLOCK)时,其行状态从更新PENDING为VICTIM
TIMEOUT         是                超时
KILLED         是                被kill调
PRE_ACQUIRE_NOTIFY    是    表示该元数据锁定subsubsystem的通知感兴趣的存储引擎,而进入锁定获取操作或离开锁释放操作
POST_RELEASE_NOTIFY    是 表示该元数据锁定subsubsystem的通知感兴趣的存储引擎,而进入锁定获取操作或离开锁释放操作


select * from performance_schema.metadata_locks

mysql> select * from performance_schema.metadata_locks
    -> ;
+-------------+--------------------+----------------+-------------+-----------------------+---------------------+---------------+-------------+-------------------+-----------------+----------------+
| OBJECT_TYPE | OBJECT_SCHEMA      | OBJECT_NAME    | COLUMN_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE           | LOCK_DURATION | LOCK_STATUS | SOURCE            | OWNER_THREAD_ID | OWNER_EVENT_ID |
+-------------+--------------------+----------------+-------------+-----------------------+---------------------+---------------+-------------+-------------------+-----------------+----------------+
| GLOBAL      | NULL               | NULL           | NULL        |       140381410162032 | INTENTION_EXCLUSIVE | STATEMENT     | PENDING     | sql_base.cc:3057  |              56 |             19 |
| TABLE       | performance_schema | metadata_locks | NULL        |       140381476746896 | SHARED_READ         | TRANSACTION   | GRANTED     | sql_parse.cc:6139 |              57 |             21 |
| GLOBAL      | NULL               | NULL           | NULL        |       140381610109536 | SHARED              | EXPLICIT      | GRANTED     | lock.cc:1054      |              55 |              5 |
| COMMIT      | NULL               | NULL           | NULL        |       140381610658816 | SHARED              | EXPLICIT      | GRANTED     | lock.cc:1129      |              55 |        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值