mysql怎么查锁表语句
时间 : 2023-03-13 04:47:02声明: : 文章内容来自网络,不保证准确性,请自行甄别信息有效性
要查看MySQL中的锁表语句,可以使用以下两种方式:
1. SHOW PROCESSLIST命令
可以使用SHOW PROCESSLIST命令来查看当前正在执行的MySQL进程列表。该命令将显示当前正在运行的进程和它们的状态,包括锁表状态。通过查看PROCESSLIST中的Lock Type列,您可以确定是否有锁表查询。
例如,运行以下命令:
SHOW PROCESSLIST;
它将显示如下结果:
+----+------------+--------------+--------------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------------+--------------+--------------+---------+------+-------+------------------+
| 1 | root | localhost | test | Sleep | 10 | | NULL |
| 2 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 3 | test_user | 192.168.1.10 | test_database| Sleep | 20 | | NULL |
| 4 | test_user | 192.168.1.10 | test_database| Query | 10 | Locked| SELECT * FROM ...|
+----+------------+--------------+--------------+---------+------+-------+------------------+
在上面的输出中,第四行表示查询正在执行,并且被锁定。
2. INFORMATION_SCHEMA表
另一种方法是使用INFORMATION_SCHEMA表来查看哪些表被锁定了。在MySQL中,每个正在运行的查询都可以在INFORMATION_SCHEMA.PROCESSLIST表中找到,可以使用该表来查看当前正在运行的查询和它们所涉及的表。
例如,运行以下命令:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
它将返回所有当前锁定的表,如下所示:
+----------------+-------------+-----------+-----------+-----------+-----------+----------------+------------------+----------+----------------+
| lock_id | lock_trx_id | lock_mode | lock_type | lock_table| lock_index| lock_space | lock_page | lock_rec | lock_data |
+----------------+-------------+-----------+-----------+-----------+-----------+----------------+------------------+----------+----------------+
| 489:12:3:2 | 489 | S | RECORD | `test`.`mytable` | PRIMARY | 12 | 3 | 2 | 3722 |
| 1711:12:4:2 | 1711 | X | TABLE | `test`.`mytable` | NULL | 12 | 4 | 2 | NULL |
+----------------+-------------+-----------+-----------+-----------+-----------+----------------+------------------+----------+----------------+
在上面的输出中,第二行表示'X'防止整个表被锁定。
总之,这两种方法都可以查看MySQL中哪些表被锁定了。使用上述方法之一,可以轻松找到导致MySQL性能问题的进程。
在 MySQL 中,我们可以使用`SHOW ENGINE INNODB STATUS`语句来查看锁定的情况,它会返回当前 InnoDB 存储引擎的状态信息,包括锁定的事务和锁定的对象。
要查找锁定的表,可以先执行`SHOW ENGINE INNODB STATUS`语句,再查找`LATEST DETECTED DEADLOCK`的下方。在下面的输出中,你会看到被锁定的表和行的信息:
------------------------
LATEST DETECTED DEADLOCK
------------------------
2020-01-01 10:00:00 42d9e8c0
*** (1) TRANSACTION:
TRANSACTION 1234, ACTIVE 0 sec fetching rows
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1184, 2 row lock(s)
MySQL thread id 1, OS thread handle 0x7f90e298d700, query id 1000 localhost root Updating
UPDATE `orders` SET `status` = 'DELIVERED' WHERE `id` = 1234
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1234 page no 5678 lock xid 123456789 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 9 PHYSICAL RECORD: n_fields 14; compact format; info bits 0
....
*** (2) TRANSACTION:
TRANSACTION 1235, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 1
MySQL thread id 2, OS thread handle 0x7f90e298e700, query id 1001 localhost root Updating
INSERT INTO `orders` (`id`, `status`) VALUES (1234, 'DELIVERED')
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1234 page no 5678 lock xid 123456789 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 9 PHYSICAL RECORD: n_fields 14; compact format; info bits 0
....
*** (3) TRANSACTION:
TRANSACTION 1236, ACTIVE 0 sec inserting
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1184, 2 row lock(s), undo log entries 1
MySQL thread id 3, OS thread handle 0x7f90e298f700, query id 1002 localhost root Updating
INSERT INTO `orders` (`id`, `status`) VALUES (5678, 'DELIVERED')
*** (3) HOLDS THE LOCK(S):
RECORD LOCKS space id 1234 page no 5678 lock xid 123456789 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 9 PHYSICAL RECORD: n_fields 14; compact format; info bits 0
....
上面的输出表示某个事务正在等待另一个事务的锁,并且另外两个事务都持有相同的锁。其中,第一个事务正在更新订单表中的一行,另外两个事务则是插入新的订单记录。由此我们可以看到,该事务正在等待某个锁被释放,这个锁由另一个事务持有。
另外,MySQL 还提供了一些系统表,例如 `information_schema` 中的 `INNODB_LOCKS`、`INNODB_LOCK_WAITS`、`INNODB_TRX` 等,可以使用这些表来查看锁定的对象和锁定行的详细信息。
在查询锁定表时,我们可以使用如下 SQL 语句:
```sql
SELECT
r.trx_id AS waiting_trx_id,
r.trx_mysql_thread_id AS waiting_thread,
r.trx_query AS waiting_query,
b.trx_id AS blocking_trx_id,
b.trx_mysql_thread_id AS blocking_thread,
b.trx_query AS blocking_query,
l.lock_table AS locked_table,
l.lock_index AS locked_index,
l.lock_mode AS lock_mode,
l.lock_type AS lock_type
FROM
information_schema.innodb_lock_waits w
INNER JOIN
information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN
information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id
INNER JOIN
information_schema.innodb_locks l ON w.blocking_lock_id = l.lock_id
GROUP BY w.requesting_trx_id , w.blocking_trx_id;
此时,查询结果将显示被锁定的表、锁的类型和锁的模式。
上一篇
mysql优化分析怎么查
下一篇
mysql查询效率怎么样
https/SSL证书广告优选IDC>>
推荐主题模板更多>>
推荐文章