ある日、RSpecのテストの実行中に、Ctrl+Cでキャンセルし、再びテストを走らせた。すると、いつまでたっても処理が止まったままだったのでそのまま放置していたら以下のようなエラーが出ました。
Lock wait timeout exceeded; try restarting transaction mysql
なぜこうなったのか
おそらく、MySQLのトランザクション(システムスペックは自動でテストデータのトランザクション処理をしてくれる)がコミットされる前にCtrl+Cでキャンセルしてしまったからだと思いますが、はっきりした原因は不明です(超ピンポイントでCtrl+Cを押してしまったため発生した?)
解決策
①mysqlにmysql -u root -p
でログインする。
②SHOW ENGINE INNODB STATUS
を実行し、TRANSACTIONSの部分を確認する。
TRANSACTIONS
------------
Trx id counter 60949
Purge done for trx's n:o < 60941 undo n:o < 0 state: running but idle
History list length 4
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 421573119466232, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 60934, ACTIVE 151 sec
7 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 6
MySQL thread id 3, OS thread handle 140097739974400, query id 78 172.20.0.3 kiyo
Trx read view will not see trx with id >= 60934, sees < 60934
③すると、151秒コミットされないままのトランザクションがありました!
thread id 3 とあるのでこのプロセスを kill 3 で削除します。
④再度実行したら、RSpecが無事実行されるようになりました。
おそらくそう起こるエラーではないですが、同じ状況になった方の手助けになれば幸いです!
参考
トランザクションを強制的に終了させる
rakeタスクでDBのレコードが更新出来なかった時の解決法
最後まで読んでいただきありがとうございます!
何かご指摘などございましたら、コメントいただけると嬉しいです!