HTTP の GET の時に、 DB が更新されるのは悪手である

新年

あけましておめでとうございます 2018 年もよろしくお願い申し上げます。

今だからこそ振り返る

2017 年を振り返る間もなく 2018 年に突入してしまいました。

しかし、 2018 年に同じことを繰り返さないように一つだけ振り返ろうと思います。

これは、 2016 年から 2017 年にかけてじわりじわりと痛手を負ってきたことです。

GET した時、作成されていなかった場合に作成する、という悪手

前提として、稼働中のサービスだった場合、長時間サービスを止めるのはできるだけ避けたい。

しかし、既存のデータを一度に変換すると、かなり時間がかかることがわかっています。

ということで、この時はサービスを動かしながら、アクセス( HTTP でいう GET )された時、データが変換されていなかったら変換して使用するようにしよう、と考えました。

コードを書いて、テストも書いて、変換されている状態でも変換されていない状態でも、正しく動作することを確認しました。

……

結果はどうだったでしょうか。

実際の動作では、変換したデータがいくつも出来てしまい、異常な状態になってしまいました。

何がいけなかったのか

落ち着いて考えてみれば、排他制御が出来ていなかった、ということが言えると思います。

データの変換はデータの更新である、という意識が抜けていて、排他制御の必要性に気づいていませんでした。

それ以前に、 GET の操作に副作用(データを追加したり更新したりする)があってはいけない、という基本を疎かにしていました。

2018 年は基本を疎かにせずにプログラミングに勤しみたいと思います。

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy