文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.19.2 获取父事件信息

data_locks 表显示了持有的和请求的数据锁。此表的行包含一个 THREAD_ID 列,用于指示拥有锁的会话的线程 ID,以及一个 EVENT_ID 列,用于指示导致锁定的 Performance Schema 事件。(THREAD_ID, EVENT_ID) 值的元组隐式地标识了其他 Performance Schema 表中的父事件

  • events_waits_xxx 表中的父等待事件

  • events_stages_xxx 表中的父阶段事件

  • events_statements_xxx 表中的父语句事件

  • events_transactions_current 表中的父事务事件

要获取有关父事件的详细信息,请将 THREAD_IDEVENT_ID 列与相应父事件表中具有相同名称的列连接起来。该关系基于嵌套集数据模型,因此该连接具有多个子句。假设由 parentchild 分别表示的父表和子表,则该连接如下所示

WHERE
  parent.THREAD_ID = child.THREAD_ID        /* 1 */
  AND parent.EVENT_ID < child.EVENT_ID      /* 2 */
  AND (
    child.EVENT_ID <= parent.END_EVENT_ID   /* 3a */
    OR parent.END_EVENT_ID IS NULL          /* 3b */
  )

该连接的条件是

  1. 父事件和子事件位于同一线程中。

  2. 子事件在父事件之后开始,因此其 EVENT_ID 值大于父事件的值。

  3. 父事件已完成或仍在运行。

要查找锁定信息,data_locks 是包含子事件的表。

data_locks 表仅显示现有锁,因此关于哪个表包含父事件,以下注意事项适用

等待、阶段和语句事件会很快从历史记录中消失。如果很久以前执行的语句获取了锁但处于仍在打开的事务中,则可能无法找到该语句,但可以找到该事务。

这就是为什么嵌套集数据模型更适合查找父事件。在父/子关系(数据锁 -> 父等待 -> 父阶段 -> 父事务)中跟踪链接在中间节点已从历史表中消失时效果不佳。

以下场景演示了如何查找获取锁语句的父事务。

会话 A

[1] START TRANSACTION;
[2] SELECT * FROM t1 WHERE pk = 1;
[3] SELECT 'Hello, world';

会话 B

SELECT ...
FROM performance_schema.events_transactions_current AS parent
  INNER JOIN performance_schema.data_locks AS child
WHERE
  parent.THREAD_ID = child.THREAD_ID
  AND parent.EVENT_ID < child.EVENT_ID
  AND (
    child.EVENT_ID <= parent.END_EVENT_ID
    OR parent.END_EVENT_ID IS NULL
  );

会话 B 的查询应该显示语句 [2] 拥有对具有 pk=1 的记录的数据锁。

如果会话 A 执行更多语句,[2] 会从历史表中消失。

查询应该显示在 [1] 中开始的事务,无论执行了多少个语句、阶段或等待。

要查看更多数据,还可以使用 events_xxx_history_long 表,但事务除外,假设服务器中没有其他查询运行(以便保留历史记录)。