@nqounetです。 mysqlで運用しているサービスで、1日に2,3回ほどDeadlockによってエラーが発生するという問題がありました。 その問題が解決したのでメモを残しておきます。 最初にまとめ mysqlのInnoDBでdeleteするのは、削除対象のレコードがある場合のみにする必要がある。 delete時に対象レコードがない場合、ギャップロックがかかりinsertが通らなくなる。 実装のちょっとした手抜きが頭を悩ます、という良い(悪い?)例になった。 参考 【MySQL】InnoDBのロック関連まとめ - Qiita まずかった実装 モデルケースとしてはupdateをdelete->insertにしていた感じの部分。 イメージはこんな感じ。 書き込む行数が変わる場合があるので毎回deleteしてからinsertしていた。 最初はinsertとupdate(delete->ins