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

