文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.19.2 取得父事件資訊

data_locks 表格顯示已持有和要求的資料鎖定。此表格的列有一個 THREAD_ID 欄位,表示擁有鎖定的工作階段執行緒 ID,以及一個 EVENT_ID 欄位,表示造成鎖定的 Performance Schema 事件。(THREAD_ID, EVENT_ID) 值的 Tuple 隱含地識別其他 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 表格僅顯示現有的鎖定,因此這些考量適用於哪個表格包含父事件

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

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

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

工作階段 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 表格,但交易除外,假設伺服器中沒有其他查詢執行(以便保留歷史記錄)。