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;

此时,查询结果将显示被锁定的表、锁的类型和锁的模式。