### 27.19.2 获取父事件信息

[](<>)[](<>)[](<>)[](<>)

这[`数据锁`](performance-schema-data-locks-table.html)表显示持有和请求的数据锁。此表的行有一个`THREAD_ID`指示拥有锁的会话的线程 ID 的列，以及`EVENT_ID`指示导致锁定的性能模式事件的列。(`THREAD_ID`,`EVENT_ID`) 值隐式标识其他性能模式表中的父事件：

-   中的父等待事件`events_waits_*`xxx`*`表

-   中的父阶段事件`events_stages_*`xxx`*`表

-   中的父语句事件`events_statements_*`xxx`*`表

-   父事务事件在[`events_transactions_current`](performance-schema-events-transactions-current-table.html)桌子

    要获取有关父事件的详细信息，请加入`THREAD_ID`和`EVENT_ID`在相应的父事件表中具有类似名称的列。该关系基于嵌套的集合数据模型，因此连接有多个子句。给定的父表和子表由`父母`和`孩子`，连接分别如下所示：


```
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.  父事件已完成或仍在运行。

    要查找锁定信息，[`数据锁`](performance-schema-data-locks-table.html)是包含子事件的表。

    这[`数据锁`](performance-schema-data-locks-table.html)table 仅显示现有锁，因此这些注意事项适用于哪个表包含父事件：

-   对于交易，唯一的选择是[`events_transactions_current`](performance-schema-events-transactions-current-table.html).如果一个事务完成了，它可能在事务历史表中，但是锁已经消失了。

-   对于语句，这完全取决于获得锁的语句是否是事务中已经完成的语句（使用[`events_statements_history`](performance-schema-events-statements-history-table.html)）或语句仍在运行（使用[`events_statements_current`](performance-schema-events-statements-current-table.html)）。

-   对于阶段，逻辑与语句类似；采用[`events_stages_history`](performance-schema-events-stages-history-table.html)要么[`events_stages_current`](performance-schema-events-stages-current-table.html).

-   对于等待，逻辑与语句类似；采用[`events_waits_history`](performance-schema-events-waits-history-table.html)要么[`events_waits_current`](performance-schema-events-waits-current-table.html).但是，记录了如此多的等待，以至于导致锁定的等待很可能已经从历史表中消失了。

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

    这就是嵌套集数据模型更适合定位父事件的原因。跟随父/子关系中的链接（数据锁定 ->家长等——>父阶段 ->父事务）在中间节点已经从历史表中消失时无法正常工作。

    下面的场景说明了如何找到获取锁的语句的父事务：

    会议 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]，无论执行了多少语句、阶段或等待。

要查看更多数据，您还可以使用`事件_*`xxx`*_history_long`表，除了事务，假设服务器中没有其他查询运行（因此保留历史记录）。
