文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (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 資料表僅顯示現有的鎖定,因此在包含父事件的資料表方面,會適用以下考量

等待、階段和語句事件會很快地從歷史記錄中消失。如果很久以前執行的語句取得了鎖定,但仍處於開啟的交易中,可能無法找到該語句,但可以找到該交易。

這就是為什麼巢狀集合資料模型更適合尋找父事件的原因。當中間節點已經從歷史記錄表中消失時,追蹤父/子關係中的連結(資料鎖定 -> 父等待 -> 父階段 -> 父交易)效果不佳。

以下情境說明如何尋找取得鎖定的語句的父交易

Session A

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

Session 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
  );

Session B 的查詢應該顯示語句 [2] 擁有 pk=1 記錄的資料鎖定。

如果 Session A 執行更多語句,[2] 將從歷史記錄表中消失。

無論執行了多少語句、階段或等待,查詢都應該顯示在 [1] 中開始的交易。

要查看更多資料,您也可以使用 events_xxx_history_long 表格,除了交易之外,假設伺服器中沒有執行其他查詢(以便保留歷史記錄)。