data_locks
テーブルには、保持およびリクエストされたデータロックが表示されます。 このテーブルの行には、ロックを所有するセッションのスレッド ID を示す THREAD_ID
カラムと、ロックの原因となったパフォーマンススキーマイベントを示す EVENT_ID
カラムがあります。 (THREAD_ID
、EVENT_ID
) 値のタプルは、他の「パフォーマンススキーマ」テーブルの親イベントを暗黙的に識別します:
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
を使用)、によって異なります。ステージの場合、ロジックはステートメントのロジックと似ています。
events_stages_history
またはevents_stages_current
を使用します。待機の場合、ロジックはステートメントのロジックと似ています。
events_waits_history
またはevents_waits_current
を使用します。 ただし、多くの待機が記録されるため、ロックの原因となった待機はすでに履歴テーブルからなくなっている可能性があります。
待機イベント、ステージイベントおよびステートメントイベントは、履歴からすぐに消えます。 長時間前に実行されたステートメントがロックを取得したが、まだオープンしているトランザクションにある場合、ステートメントを見つけることはできない可能性がありますが、トランザクションを見つけることはできます。
このため、ネストされたセットデータモデルは親イベントの検索に適しています。 中間ノードがすでに履歴テーブルから削除されている場合、親/子関係の次のリンク (データロック ->親待機 ->親ステージ ->親トランザクション) は適切に機能しません。
次のシナリオは、ロックが取得されたステートメントの親トランザクションを検索する方法を示しています:
セッション 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 のクエリーでは、pk=1
を使用してレコードのデータロックを所有しているステートメント[2]を表示する必要があります。
セッション A がさらにステートメントを実行すると、[2]は履歴テーブルからフェードアウトします。
クエリーでは、実行されたステートメント、ステージまたは待機の数に関係なく、[1]で開始されたトランザクションが表示されます。
サーバーで他のクエリーが実行されないことを前提として (履歴が保持されるように)、events_
テーブルを使用してさらにデータを表示することもできます (トランザクションを除く)。
xxx
_history_long