Deadlock found when trying to get lock; try restarting transaction

提供:MySQL Practice Wiki

移動: 案内, 検索

エラー概要

MySQLエラー番号 1213
SQLSTATE 40001
エラー名 ER_LOCK_DEADLOCK
メッセージ Deadlock found when trying to get lock; try restarting transaction
障害部位 InnoDBストレージエンジン(mysqld)
該当バージョン any
エラーの原因 下記を参照。
対策 アプリケーションによるリトライ。詳細は下記を参照。
備考

原因

InnoDBは行レベルのロッキングを採用しているため、先天的にデッドロックを起こす可能性がある。そして、デッドロックにより処理が滞るのを防ぐため、InnoDBはデッドロックを検知する仕組みを備えている。デッドロックを検知するとこのエラーが直ちに返される。InnoDBのデッドロックは完全に動作するが、トランザクション内で他のストレージエンジン(例えばMyISAMなど)を含んだ場合などはこの検出機構が正しく動作しないので注意が必要。その場合はロック待ちのタイムアウト(lock-wait-timeout)という現象になる。

対処

デッドロックが発生した場合、アプリケーション側でリトライ処理を行う必要がある。(そのようにアプリケーションを作成する必要がある。)多くの場合、そのほかの対処は必要ない。希にデッドロックが多発しすぎてある特定のクエリが実行出来ないというような場合があるが、そのような場合にはクエリに問題がある可能性が高いのでクエリを見直す必要がある。

デッドロックは完全に防ぐことが出来ないので、InnoDBを使う場合リトライ処理は必須となる。

一度に操作する行を減らすことで、デッドロックを軽減することが出来る。