InnoDB
は、トランザクションのデッドロックを自動的に検出し、そのトランザクションをロールバックしてデッドロックを回避します。バージョン
4.0.5 より、InnoDB
は小さいほうのトランザクションを選択してロールバックするようになります。トランザクションのサイズは、挿入、更新、または削除したレコードの数によって決定されます。
4.0.5 より前のバージョンの InnoDB
では、デッドロックを引き起こすロックを要求したトランザクションを、常にロールバックしていました。
InnoDB
は、MySQL の LOCK
TABLES
ステートメントが設定したロックが関係するデッドロック、または
InnoDB
以外のストレージエンジンで設定されたロックが関係するデッドロックを検出できません。これらの状況は、my.cnf
で設定する innodb_lock_wait_timeout
を使って解決する必要があります。
InnoDB
がトランザクションの完全なロールバックを実行すると、そのトランザクションのすべてのロックが解除されます。ところが、エラーのために単一の
SQL
ステートメントのみがロールバックされると、SQL
が設定したロックの一部が保持される場合があります。これは、InnoDB
が使用する行ロックの格納形式では、ロックを設定した
SQL
ステートメントを後から特定できないためです。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.