Lock wait timeout exceeded; try restarting transaction

出典: MySQL Practice Wiki

エラー概要

MySQLエラー番号 1205
SQLSTATE HY000
エラー名 ER_LOCK_WAIT_TIMEOUT
メッセージ Lock wait timeout exceeded; try restarting transaction
障害部位 InnoDBストレージエンジン
該当バージョン any
エラーの原因 他のセッションによりロックが長時間保持されていること。詳細は下記を参照。
対策 リトライ処理またはクエリの最適化。詳細は下記を参照。
備考

原因

ロック待ちのタイムアウトもある種のロックの競合であるが、デッドロックとは現象が異なる。(よく混同されるがまったくの別現象。)他のスレッドが保持しているロックをinnodb_lock_wait_timeout秒間待っても獲得出来なかった場合に発生する。

最適化されていないクエリによって発生することが多い。(SELECT ... FOR UPDATEがフルテーブルスキャンしてしまった場合など。)

対処

トランザクションをリトライする必要があるので、InnoDB使用時はアプリケーションのロジックをそのように作り込むこと。

クエリを最適化して、長時間ロックを保持しないようにする。特にインデックスが適切に使用されることが重要。範囲検索やJOINをよく最適化しよう。

個人用ツール