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_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
資料表僅顯示現有的鎖定,因此在包含父事件的資料表方面,會適用以下考量
對於交易,唯一的選擇是
events_transactions_current
。如果交易已完成,則可能會在交易歷史資料表中,但鎖定已消失。對於陳述式,一切都取決於取得鎖定的陳述式是否為已完成交易中的陳述式 (使用
events_statements_history
) 或陳述式仍在執行中 (使用events_statements_current
)。對於階段(stages),其邏輯與語句(statements)類似;請使用
events_stages_history
或events_stages_current
。對於等待(waits),其邏輯與語句類似;請使用
events_waits_history
或events_waits_current
。然而,由於記錄的等待次數非常多,導致造成鎖定的等待很可能已經從歷史記錄表中消失。
等待、階段和語句事件會很快地從歷史記錄中消失。如果很久以前執行的語句取得了鎖定,但仍處於開啟的交易中,可能無法找到該語句,但可以找到該交易。
這就是為什麼巢狀集合資料模型更適合尋找父事件的原因。當中間節點已經從歷史記錄表中消失時,追蹤父/子關係中的連結(資料鎖定 -> 父等待 -> 父階段 -> 父交易)效果不佳。
以下情境說明如何尋找取得鎖定的語句的父交易
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