このセクションでは、MySQL 8.0 内の INFORMATION_SCHEMA
INNODB_LOCKS
および INNODB_LOCK_WAITS
テーブルよりも優先される、パフォーマンススキーマ data_locks
および data_lock_waits
テーブルによって公開されるロック情報について説明します。 古い INFORMATION_SCHEMA
テーブルに関して記述されている同様の説明は、MySQL 5.7 Reference Manual の InnoDB INFORMATION_SCHEMA Transaction and Locking Information を参照してください。
一方の INFORMATION_SCHEMA
テーブルと 2 つの「パフォーマンススキーマ」テーブルを使用すると、InnoDB
トランザクションを監視し、潜在的なロックの問題を診断できます:
-
INNODB_TRX
: このINFORMATION_SCHEMA
テーブルには、InnoDB
内で現在実行されているすべてのトランザクションに関する情報が表示されます。これには、トランザクションの状態 (実行中かロック待機中かなど)、トランザクションの開始時期、トランザクションが実行されている特定の SQL ステートメントなどが含まれます。 -
data_locks
:「このパフォーマンススキーマ」テーブルには、各保留ロックの行と、保留ロックの解放を待機してブロックされる各ロックリクエストが含まれています:ロックを保持しているトランザクションの状態 (
INNODB_TRX.TRX_STATE
がRUNNING
,LOCK WAIT
,ROLLING BACK
またはCOMMITTING
) にかかわらず、保持されているロックごとに 1 つの行があります。-
別のトランザクションがロックを解放するのを待機している InnoDB 内の各トランザクション (
INNODB_TRX.TRX_STATE
はLOCK WAIT
) は、単一のブロッキングロックリクエストによってブロックされます。 そのブロックしているロック要求は、互換性がないモードにある別のトランザクションによって保持されている行ロックまたはテーブルロックに対するものです。 ロック要求には常に、要求をブロックする保持ロックのモード (読み取りと書き込み、共有と排他) と互換性のないモードがあります。ブロックされたトランザクションは、他のトランザクションがコミットまたはロールバックされ、リクエストされたロックが解放されるまで続行できません。 ブロックされたトランザクションごとに、
data_locks
には、トランザクションがリクエストしたロックと待機しているロックを示す行が 1 つ含まれます。
-
data_lock_waits
:「このパフォーマンススキーマ」テーブルには、特定のロックを待機しているトランザクション、または特定のトランザクションが待機しているロックが示されます。 このテーブルには、ブロックされているトランザクションごとに、そのトランザクションが要求したロックと、その要求をブロックしているロックを示す 1 つ以上の行が含まれています。REQUESTING_ENGINE_LOCK_ID
値はトランザクションによってリクエストされたロックを参照し、BLOCKING_ENGINE_LOCK_ID
値は最初のトランザクションの続行を妨げる (別のトランザクションによって保持されている) ロックを参照します。 特定のブロックされたトランザクションについて、data_lock_waits
のすべての行の値は、REQUESTING_ENGINE_LOCK_ID
では同じで、BLOCKING_ENGINE_LOCK_ID
では異なる値になります。
前述のテーブルの詳細は、セクション26.51.29「INFORMATION_SCHEMA INNODB_TRX テーブル」、セクション27.12.13.1「data_locks テーブル」 および セクション27.12.13.2「data_lock_waits テーブル」 を参照してください。