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


15.7.5.2 デッドロック検出

deadlock detection が有効な場合 (デフォルト)、InnoDB はトランザクション deadlocks を自動的に検出し、デッドロックを解消するためにトランザクションをロールバックします。 InnoDB は、小さいトランザクションを選択してロールバックしようと試みます。トランザクションのサイズは、挿入、更新、または削除された行数によって決定されます。

InnoDB は、innodb_table_locks = 1 (デフォルト) かつ autocommit = 0 の場合にテーブルロックを認識し、それよりも上位の MySQL レイヤーは、行レベルロックを識別します。 それ以外の場合、InnoDB は、MySQL LOCK TABLES ステートメントで設定されたテーブルロックまたは InnoDB 以外のストレージエンジンで設定されたロックが関連しているデッドロックを検出できません。 このような状況を解決するには、innodb_lock_wait_timeout システム変数の値を設定します。

InnoDB Monitor 出力の LATEST DETECTED DEADLOCK セクションに「グラフのロックテーブルの検索が深すぎるか長すぎます。次のトランザクションをロールバック」というメッセージが含まれている場合、これは、キャンセル待ちリストのトランザクション数が 200 の制限に達したことを示します。 200 個のトランザクションを超える待機リストはデッドロックとして処理され、待機リストをチェックしようとするトランザクションはロールバックされます。 ロックスレッドが待機リストのトランザクションが所有する 1,000,000 を超えるロックを参照する必要がある場合も、同じエラーが発生する可能性があります。

デッドロックを回避するためにデータベース操作を編成する方法については、セクション15.7.5「InnoDB のデッドロック」を参照してください。

デッドロック検出の無効化

同時実行性の高いシステムでは、多数のスレッドが同じロックを待機している場合、デッドロック検出によって速度が低下する可能性があります。 デッドロック検出を無効にし、デッドロック発生時のトランザクションロールバックの innodb_lock_wait_timeout 設定に依存する方が効率的な場合があります。 デッドロック検出は、innodb_deadlock_detect 構成オプションを使用して無効にできます。


関連キーワード:  InnoDB, テーブル, デッドロック, 構成, ロック, トランザクション, 検出, 圧縮, スペース, インデックス