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_ID
和 EVENT_ID
欄位與適當父事件表格中名稱相同的欄位聯結。此關係基於巢狀集合資料模型,因此聯結有多個子句。假設父表格和子表格分別以 parent
和 child
表示,則聯結看起來像這樣
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 */
)
聯結的條件為
父事件和子事件位於同一個執行緒中。
子事件在父事件之後開始,因此其
EVENT_ID
值大於父事件的值。父事件已完成或仍在執行中。
若要尋找鎖定資訊,data_locks
是包含子事件的表格。
data_locks
表格僅顯示現有的鎖定,因此這些考量適用於哪個表格包含父事件
對於交易(transactions)而言,唯一的選擇是
events_transactions_current
。如果交易已完成,它可能會存在於交易歷史記錄表(transaction history tables)中,但鎖定(locks)已不再存在。對於語句(statements),這完全取決於取得鎖定的語句是否是已完成交易中的語句(請使用
events_statements_history
),或者該語句是否仍在執行中(請使用events_statements_current
)。對於階段(stages),其邏輯與語句類似;請使用
events_stages_history
或events_stages_current
。對於等待(waits),其邏輯與語句類似;請使用
events_waits_history
或events_waits_current
。然而,由於記錄了太多等待,導致造成鎖定的等待很可能已從歷史記錄表中消失。
等待、階段和語句事件很快就會從歷史記錄中消失。如果很久以前執行的語句取得了鎖定,但仍在一個開啟的交易中,則可能無法找到該語句,但可以找到該交易。
這就是為什麼巢狀集合數據模型(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