delete-insertパターンを処理しているところでデッドロックが発生しました。
#<Sequel::SerializationFailure: Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction> |
ネクストキーロックやギャップロックは分かっていたのですが、横着して書いたせいか件数チェックをしないでレコードが無い場合でもDELETEを行っていたのが原因です。トランザクション分離レベルはInnoDBデフォルトの「Repeatable Read」です。
トランザクション分離レベルを変更しろという記事を結構見るのですが、トランザクション分離レベルの変更はアプリケーションの設計に大きな影響を与えるため、気軽に変更するのは反対です。今回は、件数を確認して削除対象レコードが存在する場合のみDeleteを実行するようにしました。
# 駄目 |
参考
- http://dwmemo.hatenablog.com/entry/2018/01/28/220848
- https://www.slideshare.net/yuyamada777/delete-77702365
今回の件とは直接関係はないけど、分離レベルとロストアップデートの話