Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


17.15.2.1 使用 InnoDB 事务和锁定信息

本节描述了性能_schema 中的锁定信息,包括data_locksdata_lock_waits表。

有时,需要确定哪个事务阻塞了另一个。包含 InnoDB 事务和数据锁定信息的表使您能够确定哪个事务等待另一个事务,并请求哪些资源。 (关于这些表的描述,请见第17.15.2节,“InnoDB INFORMATION_SCHEMA 事务和锁定信息”。)

假设三个会话同时运行,每个会话对应一个 MySQL 线程,执行一系列事务。考虑系统的状态,当这些会话已经发出以下语句,但还没有提交事务时:

  • Session A:

    BEGIN;
    SELECT a FROM t FOR UPDATE;
    SELECT SLEEP(100);
  • Session B:

    SELECT b FROM t FOR UPDATE;
  • Session C:

    SELECT c FROM t FOR UPDATE;

在这种情况下,可以使用以下查询来查看哪些事务等待,哪些事务阻塞它们:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

或者,更简单地使用 sys schema 中的innodb_lock_waits视图:

SELECT
  waiting_trx_id,
  waiting_pid,
  waiting_query,
  blocking_trx_id,
  blocking_pid,
  blocking_query
FROM sys.innodb_lock_waits;

如果报告了 NULL 值作为阻塞查询,请参阅Idle 会话后识别阻塞查询

waiting trx id waiting thread waiting query blocking trx id blocking thread blocking query
A4 6 SELECT b FROM t FOR UPDATE A3 5 SELECT SLEEP(100)
A5 7 SELECT c FROM t FOR UPDATE A3 5 SELECT SLEEP(100)
A5 7 SELECT c FROM t FOR UPDATE A4 6 SELECT b FROM t FOR UPDATE

在上表中,您可以通过“等待查询”或“阻塞查询”列来识别会话。如您所见:

  • 会话 B(事务 ID A4,线程 6)和会话 C(事务 ID A5,线程 7)都在等待会话 A(事务 ID A3,线程 5)。

  • 会话 C 也在等待会话 B 和会话 A。

您可以在 INFORMATION_ SCHEMA INNODB_TRX 表和性能chema data_locksdata_lock_waits 表中查看 underlying 数据。

以下表格显示了 INNODB_TRX 表的一些示例内容。

trx id trx state trx started trx requested lock id trx wait started trx weight trx mysql thread id trx query
A3 RUNNING 2008-01-15 16:44:54 NULL NULL 2 5 SELECT SLEEP(100)
A4 LOCK WAIT 2008-01-15 16:45:09 A4:1:3:2 2008-01-15 16:45:09 2 6 SELECT b FROM t FOR UPDATE
A5 LOCK WAIT 2008-01-15 16:45:14 A5:1:3:2 2008-01-15 16:45:14 2 7 SELECT c FROM t FOR UPDATE

以下是data_locks表的一些示例内容。

lock id lock trx id lock mode lock type lock schema lock table lock index lock data
A3:1:3:2 A3 X RECORD test t PRIMARY 0x0200
A4:1:3:2 A4 X RECORD test t PRIMARY 0x0200
A5:1:3:2 A5 X RECORD test t PRIMARY 0x0200

以下是data_lock_waits表的一些示例内容。

requesting trx id requested lock id blocking trx id blocking lock id
A4 A4:1:3:2 A3 A3:1:3:2
A5 A5:1:3:2 A3 A3:1:3:2
A5 A5:1:3:2 A4 A4:1:3:2

当识别阻塞事务时,如果会话已经闲置,报告的阻塞查询将为 NULL。这种情况下,可以按照以下步骤确定阻塞查询:

  1. 确定阻塞事务的进程列表 ID。在sys.innodb_lock_waits表中,阻塞事务的进程列表 ID 是blocking_pid值。

  2. 使用blocking_pid,查询 MySQL Performance Schemathreads表,以确定阻塞事务的THREAD_ID。例如,如果blocking_pid为 6,执行以下查询:

    SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6;
  3. 使用THREAD_ID,查询 Performance Schemaevents_statements_current表,以确定线程最后执行的查询。例如,如果THREAD_ID为 28,执行以下查询:

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current
    WHERE THREAD_ID = 28\G
  4. 如果线程最后执行的查询不足以确定锁定的原因,您可以使用性能chema中的events_statements_history表来查看线程执行的最后10个语句。

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_history
    WHERE THREAD_ID = 28 ORDER BY EVENT_ID;

有时,需要将内部InnoDB锁定信息与MySQL会话级别的信息相关联。例如,您可能想知道,对于给定的InnoDB事务ID,相应的MySQL会话ID和会话名称,这些信息可能正在持有锁定,从而阻止其他事务。

以下来自INFORMATION_ SCHEMAINNODB_TRX表和性能chema中的data_locksdata_lock_waits表的输出来自一个 somewhat 加载的系统。如可以看到,有多个事务正在运行。

以下data_locksdata_lock_waits表显示:

  • 事务 77F(执行INSERT) 等待事务 77E77D77B 提交。

  • 事务 77E(执行INSERT) 等待事务 77D77B 提交。

  • 事务 77D(执行INSERT) 等待事务 77B 提交。

  • 事务 77B(执行INSERT) 等待事务 77A 提交。

  • 事务 77A 正在运行,当前执行SELECT

  • 事务 E56(执行INSERT) 等待事务 E55 提交。

  • 事务 E55(执行INSERT) 等待事务 19C 提交。

  • 事务19C正在运行,当前执行INSERT

Note

可能存在在INFORMATION_ SCHEMA中的查询PROCESSLISTINNODB_TRX表之间的不一致。了解原因,请参见第17.15.2.3节,“InnoDB事务和锁定信息的持久性和一致性”

以下表格显示了一个运行高负载工作负载的系统中的PROCESSLIST表内容。

ID USER HOST DB COMMAND TIME STATE INFO
384 root localhost test Query 10 update INSERT INTO t2 VALUES …
257 root localhost test Query 3 update INSERT INTO t2 VALUES …
130 root localhost test Query 0 update INSERT INTO t2 VALUES …
61 root localhost test Query 1 update INSERT INTO t2 VALUES …
8 root localhost test Query 1 update INSERT INTO t2 VALUES …
4 root localhost test Query 0 preparing SELECT * FROM PROCESSLIST
2 root localhost test Sleep 566 NULL

以下表格显示了一个运行高负载工作负载的系统中的INNODB_TRX表的内容。

trx id trx state trx started trx requested lock id trx wait started trx weight trx mysql thread id trx query
77F LOCK WAIT 2008-01-15 13:10:16 77F 2008-01-15 13:10:16 1 876 INSERT INTO t09 (D, B, C) VALUES …
77E LOCK WAIT 2008-01-15 13:10:16 77E 2008-01-15 13:10:16 1 875 INSERT INTO t09 (D, B, C) VALUES …
77D LOCK WAIT 2008-01-15 13:10:16 77D 2008-01-15 13:10:16 1 874 INSERT INTO t09 (D, B, C) VALUES …
77B LOCK WAIT 2008-01-15 13:10:16 77B:733:12:1 2008-01-15 13:10:16 4 873 INSERT INTO t09 (D, B, C) VALUES …
77A RUNNING 2008-01-15 13:10:16 NULL NULL 4 872 SELECT b, c FROM t09 WHERE …
E56 LOCK WAIT 2008-01-15 13:10:06 E56:743:6:2 2008-01-15 13:10:06 5 384 INSERT INTO t2 VALUES …
E55 LOCK WAIT 2008-01-15 13:10:06 E55:743:38:2 2008-01-15 13:10:13 965 257 INSERT INTO t2 VALUES …
19C RUNNING 2008-01-15 13:09:10 NULL NULL 2900 130 INSERT INTO t2 VALUES …
E15 RUNNING 2008-01-15 13:08:59 NULL NULL 5395 61 INSERT INTO t2 VALUES …
51D RUN­NING 2008-01-15 13:08:47 NULL NULL 9807 8 INSERT INTO t2 VALUES …

以下表格显示了一个运行高负载工作负载data_lock_waits表的内容。

requesting trx id requested lock id blocking trx id blocking lock id
77F 77F:806 77E 77E:806
77F 77F:806 77D 77D:806
77F 77F:806 77B 77B:806
77E 77E:806 77D 77D:806
77E 77E:806 77B 77B:806
77D 77D:806 77B 77B:806
77B 77B:733:12:1 77A 77A:733:12:1
E56 E56:743:6:2 E55 E55:743:6:2
E55 E55:743:38:2 19C 19C:743:38:2

以下表格显示了一个运行高负载工作负载的系统中的data_locks表的内容。

lock id lock trx id lock mode lock type lock schema lock table lock index lock data
77F:806 77F AUTO_INC TABLE test t09 NULL NULL
77E:806 77E AUTO_INC TABLE test t09 NULL NULL
77D:806 77D AUTO_INC TABLE test t09 NULL NULL
77B:806 77B AUTO_INC TABLE test t09 NULL NULL
77B:733:12:1 77B X RECORD test t09 PRIMARY supremum pseudo-record
77A:733:12:1 77A X RECORD test t09 PRIMARY supremum pseudo-record
E56:743:6:2 E56 S RECORD test t2 PRIMARY 0, 0
E55:743:6:2 E55 X RECORD test t2 PRIMARY 0, 0
E55:743:38:2 E55 S RECORD test t2 PRIMARY 1922, 1922
19C:743:38:2 19C X RECORD test t2 PRIMARY 1922, 1922