MySQL 8.0 リファレンスマニュアル


15.15.2.2 InnoDB のロックおよびロック待機情報

注記

このセクションでは、MySQL 8.0 内の INFORMATION_SCHEMA INNODB_LOCKS および INNODB_LOCK_WAITS テーブルよりも優先される、パフォーマンススキーマ data_locks および data_lock_waits テーブルによって公開されるロック情報について説明します。 古い INFORMATION_SCHEMA テーブルに関して記述されている同様の説明は、MySQL 5.7 Reference ManualInnoDB 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 テーブルには、ほかのトランザクションによって要求されたロックをブロックしているトランザクションによってすでに保持されているロックが表示されます。


関連キーワード:  InnoDB, テーブル, ロック, トランザクション, 構成, INFORMATION, SCHEMA, 圧縮, 情報, スペース