このセクションでは、MySQL 8.0 内の INFORMATION_SCHEMA
INNODB_LOCKS
および INNODB_LOCK_WAITS
テーブルよりも優先される、パフォーマンススキーマ data_locks
および data_lock_waits
テーブルによって公開されるロック情報について説明します。 古い INFORMATION_SCHEMA
テーブルに関して記述されている同様の説明は、MySQL 5.7 Reference Manual の InnoDB Lock and Lock-Wait Information を参照してください。
トランザクションがテーブル内の行を更新するか、または SELECT FOR UPDATE
でロックする場合、InnoDB
はその行に関するロックのリストまたはキューを確立します。 同様に、テーブルレベルのロックの場合、InnoDB
はテーブルに関するロックのリストを保持します。 2 番目のトランザクションが、互換性がないモードにある以前のトランザクションによってすでにロックされている行の更新またはテーブルのロックを行おうとした場合、InnoDB
はその行に対するロック要求を対応するキューに追加します。 トランザクションによってロックを取得するには、その行またはテーブルのロックキューに以前に入力されたすべての互換性のないロックリクエストを削除する必要があります (これらのロックを保持またはリクエストしているトランザクションがコミットまたはロールバックしたときに発生します)。
トランザクションは、異なる行またはテーブルに対する任意の数のロック要求を保持できます。 トランザクションはいつでも、別のトランザクションによって保持されているロックを要求できますが、そのロックは、その別のトランザクションによってブロックされます。 リクエスト側トランザクションは、ブロッキングロックを保持するトランザクションがコミットまたはロールバックされるまで待機する必要があります。 トランザクションがロックを待機していない場合は、RUNNING
状態になります。 トランザクションがロックを待機している場合は、LOCK WAIT
状態になります。 (INFORMATION_SCHEMA
INNODB_TRX
テーブルは、トランザクションの状態の値を示します。)
パフォーマンススキーマ data_locks
テーブルには、LOCK WAIT
トランザクションごとに 1 つ以上の行が保持され、その進行を妨げるロック要求があることを示します。 このテーブルにはまた、特定の行またはテーブルに対して保留されているロックのキュー内の各ロックを記述した 1 行も含まれています。 パフォーマンススキーマ data_lock_waits
テーブルには、ほかのトランザクションによって要求されたロックをブロックしているトランザクションによってすでに保持されているロックが表示されます。