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をよく最適化しよう。

