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_SCHEMA
INNODB_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
。