data_locks 表格顯示已持有和請求的資料鎖定。如需有關哪些鎖定請求被哪些已持有的鎖定封鎖的資訊,請參閱第 29.12.13.2 節「data_lock_waits 表格」。
資料鎖定資訊範例
mysql> SELECT * FROM performance_schema.data_locks\G
*************************** 1. row ***************************
ENGINE: INNODB
ENGINE_LOCK_ID: 139664434886512:1059:139664350547912
ENGINE_TRANSACTION_ID: 2569
THREAD_ID: 46
EVENT_ID: 12
OBJECT_SCHEMA: test
OBJECT_NAME: t1
PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139664350547912
LOCK_TYPE: TABLE
LOCK_MODE: IX
LOCK_STATUS: GRANTED
LOCK_DATA: NULL
*************************** 2. row ***************************
ENGINE: INNODB
ENGINE_LOCK_ID: 139664434886512:2:4:1:139664350544872
ENGINE_TRANSACTION_ID: 2569
THREAD_ID: 46
EVENT_ID: 12
OBJECT_SCHEMA: test
OBJECT_NAME: t1
PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
INDEX_NAME: GEN_CLUST_INDEX
OBJECT_INSTANCE_BEGIN: 139664350544872
LOCK_TYPE: RECORD
LOCK_MODE: X
LOCK_STATUS: GRANTED
LOCK_DATA: supremum pseudo-record與大多數 Performance Schema 資料收集不同,沒有控制是否收集資料鎖定資訊的工具,也沒有控制資料鎖定表格大小的系統變數。Performance Schema 會收集伺服器中已有的資訊,因此不會產生記憶體或 CPU 額外負擔來產生此資訊,也不需要控制其收集的參數。
使用data_locks表格來協助診斷在大量並行負載期間發生的效能問題。對於 InnoDB,請參閱第 17.15.2 節「InnoDB INFORMATION_SCHEMA 交易與鎖定資訊」中對此主題的討論。
data_locks表格具有下列欄位
ENGINE持有或請求鎖定的儲存引擎。
ENGINE_LOCK_ID儲存引擎所持有或請求的鎖定 ID。 (
ENGINE_LOCK_ID,ENGINE) 值的 Tuple 是唯一的。鎖定 ID 格式是內部的,隨時可能變更。應用程式不應依賴於鎖定 ID 具有特定格式。
ENGINE_TRANSACTION_ID請求鎖定的交易之儲存引擎內部 ID。這可以被視為鎖定的擁有者,儘管鎖定可能仍處於擱置狀態,尚未實際授予 (
LOCK_STATUS='WAITING')。如果交易尚未執行任何寫入作業 (仍被視為唯讀),則該欄包含使用者不應嘗試解讀的內部資料。否則,該欄就是交易 ID。
對於
InnoDB,若要取得關於交易的詳細資訊,請將此欄與INFORMATION_SCHEMAINNODB_TRX表格的TRX_ID欄位聯結。THREAD_ID建立鎖定的工作階段執行緒 ID。若要取得關於執行緒的詳細資訊,請將此欄與 Performance Schema
threads表格的THREAD_ID欄位聯結。可以將
THREAD_ID與EVENT_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欄位與適當的父事件表格中具有相同名稱的欄位進行聯結。請參閱第 29.19.2 節,「取得父事件資訊」。OBJECT_SCHEMA包含鎖定表格的綱要。
OBJECT_NAME鎖定表格的名稱。
PARTITION_NAME鎖定分割區的名稱 (如果有的話);否則為
NULL。SUBPARTITION_NAME鎖定子分割區的名稱 (如果有的話);否則為
NULL。INDEX_NAME鎖定索引的名稱 (如果有的話);否則為
NULL。實際上,
InnoDB一律會建立索引 (GEN_CLUST_INDEX),因此INDEX_NAME對於InnoDB表格而言是非NULL的。OBJECT_INSTANCE_BEGIN鎖定在記憶體中的位址。
LOCK_TYPE鎖定的類型。
該值取決於儲存引擎。對於
InnoDB,允許的值為:用於列級鎖定的RECORD,以及用於表級鎖定的TABLE。LOCK_MODE鎖定的請求方式。
該值取決於儲存引擎。對於
InnoDB,允許的值為S[,GAP]、X[,GAP]、IS[,GAP]、IX[,GAP]、AUTO_INC和UNKNOWN。除了AUTO_INC和UNKNOWN之外的鎖定模式,如果存在則表示間隙鎖定。有關S、X、IS、IX和間隙鎖定的資訊,請參閱第 17.7.1 節,「InnoDB 鎖定」。LOCK_STATUS鎖定請求的狀態。
該值取決於儲存引擎。對於
InnoDB,允許的值為GRANTED(持有鎖定) 和WAITING(正在等待鎖定)。LOCK_DATA與鎖定相關聯的資料 (如果有的話)。該值取決於儲存引擎。對於
InnoDB,如果LOCK_TYPE為RECORD,則會顯示值,否則該值為NULL。鎖定在主索引鍵索引上的鎖定會顯示鎖定記錄的主索引鍵值。鎖定在次要索引上的鎖定會顯示鎖定記錄的次要索引值,並附加主索引鍵值。如果沒有主索引鍵,LOCK_DATA會根據InnoDB叢集索引使用規則,顯示所選唯一索引的索引鍵值或唯一的InnoDB內部資料列 ID 編號 (請參閱第 17.6.2.1 節,「叢集索引和次要索引」)。LOCK_DATA會針對在至上虛擬記錄上取得的鎖定報告「至上虛擬記錄」。如果鎖定記錄所在的頁面在持有鎖定時寫入磁碟,因此不在緩衝池中,InnoDB則不會從磁碟提取頁面。相反地,LOCK_DATA會報告NULL。
data_locks 表格具有這些索引
主索引鍵位於 (
ENGINE_LOCK_ID,ENGINE)索引位於 (
ENGINE_TRANSACTION_ID,ENGINE)索引位於 (
THREAD_ID,EVENT_ID)索引位於 (
OBJECT_SCHEMA,OBJECT_NAME,PARTITION_NAME,SUBPARTITION_NAME)
不允許對 data_locks 表格使用 TRUNCATE TABLE。