InnoDB
は自動的にトランザクションのデッドロックを検出し、デッドロックを破壊する為にトランザクションをロールバックします。InnoDB
は、トランザクションのサイズが挿入、更新、または削除された行数によって決定される小さいトランザクションを選んでロールバックしようとします。
InnoDB
は
innodb_table_locks=1
(デフォルト)と
AUTOCOMMIT=0
であればテーブル
ロックを認識しており、またそれより上位の
MySQL レイヤは行レベル
ロックを識別します。そうでなければ、InnoDB
は MySQL LOCK TABLES
ステートメントによるテーブル ロック
セットや InnoDB
以外のストレージ
エンジンによるロック
セットが関連しているデッドロックを検出する事ができません。innodb_lock_wait_timeout
システム変数の値を設定する事によって、これらの状況を解決しなければいけません。
InnoDB
がトランザクションの完全なロールバックを実行する時、トランザクションによって設定される全てのロックはリリースされます。しかし、もし単一
SQL
ステートメントだけがエラーの結果ロールバックされると、ステートメントによって設定されたいくつかのロックは維持されるかもしれません。これは、InnoDB
が、後でどの行がどのステートメントによって設定されたのかという事を確認する事ができないようなフォーマットで行ロックを格納する為に起こります。