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
與大多數效能架構資料收集不同,沒有用於控制是否收集資料鎖定資訊的工具,也沒有用於控制資料鎖定表格大小的系統變數。效能架構收集伺服器中已提供的資訊,因此不會產生任何記憶體或 CPU 額外負荷來產生此資訊,或需要參數來控制其收集。
使用data_locks
表格,以協助診斷在大量並行負載期間發生的效能問題。對於 InnoDB
,請參閱第 17.15.2 節,「InnoDB INFORMATION_SCHEMA 交易和鎖定資訊」中關於此主題的討論。
data_locks
表格具有下列欄位
ENGINE
持有或請求鎖定的儲存引擎。
ENGINE_LOCK_ID
儲存引擎持有或請求的鎖定 ID。(
ENGINE_LOCK_ID
,ENGINE
) 值組是唯一的。鎖定 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
導致鎖定的效能架構事件。(
THREAD_ID
,EVENT_ID
) 值的元組隱式地識別其他效能架構表格中的父事件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
),因此InnoDB
表格的INDEX_NAME
不會是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
群集索引使用規則(請參閱第 17.6.2.1 節,「群集索引和次索引」),顯示所選唯一索引的鍵值或唯一InnoDB
內部列 ID 編號。LOCK_DATA
會針對在至高(supremum)虛擬記錄上取得的鎖定報告「「supremum pseudo-record」」。如果包含鎖定記錄的頁面在持有鎖定時寫入磁碟,因此不在緩衝池中,則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
。