InnoDB
では,自動的にトランザクションのデッドロックが検出され,デッドロックを解除するためにトランザクション(複数の場合あり)がロールバックされます。InnoDB
は,小さいトランザクションを選択してロルバックしようと試みます。トランザクションのサ,ズは,挿入,更新,または削除された行数によって決定されます。
InnoDB
は,innodb_table_locks = 1
(デフォルト)か演算器自动提交= 0
の場合にテーブルロックを認識し,それよりも上位のMySQLレイヤーは,行レベルロックを識別します。それ以外の場合,InnoDB
はMySQL锁表
ステトメントで設定されたテブルロックまたはInnoDB
以外のストレジエンジンで設定されたロックが関連しているデッドロックを検出できません。このような状況を解決するには,innodb_lock_wait_timeout
システム変数の値を設定します。
InnoDB
でトランザクションの完全なロールバックが実行されると,トランザクションで設定されたすべてのロックが解放されます。ただし,エラーの結果として単一のSQLステートメントのみがロールバックされると,ステートメントで設定された一部のロックが保持される可能性があります。これが発生する原因は,InnoDB
では,どの行がどのステートメントで設定されたのかをあとで確認できないような形式で,行ロックが格納されるためです。
トランザクションで选择
がストアドファンクションを呼び出し,そのファンクション内のステートメントに失敗した場合は,そのステートメントがロールバックされます。さらに,そのあとで回滚
が実行された場合,トランザクション全体がロルバックされます。
デッドロックを回避するためにデタベス操作を編成する方法に,セクション14.2.11 "デッドロックの対処方法"を参照してください。