8
5

More than 5 years have passed since last update.

rakeタスクでDBのレコードが更新出来なかった時の解決法

Posted at

事象

rakeで数千件分のレコードを更新する処理を走らせたら以下のエラーが発生した。

rake aborted!
ActiveRecord::TransactionIsolationConflict: Transaction isolation conflict detected: Lock wait timeout exceeded; try restarting transaction

原因

MySQLでトランザクションがコミットされる前にプログラム何らかの原因で終了してしまい、ロックを握ったまま放置されたことが原因みたいです。
おそらくですがrails cのsandboxモードを終了しないままrakeタスクを走らせたからではないかと思います。

解決方法

1:mysqlにターミナルからログインmysql -u root -p
2:SHOW ENGINE INNODB STATUSで一覧が表示されるので"TRANSACTIONS"の項目を見る

MySQL thread id 35, OS thread handle 0x13291e000, query id 107117 localhost 127.0.0.1 root cleaning up
---TRANSACTION 421810, ACTIVE 16448 sec

3:16448秒もcommitされないままのトランザクションを発見!このプロセスid 35をkill 35で消す
4:再度rakeタスクを実行すると成功した

参考

トランザクションを強制的に終了させる

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5