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 のデッドロック」を参照してください。