ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

データベースが更新されない、が発生して理由にすぐ気がつけない

処理が始まってデータベースに接続を行い、トランザクション処理を行い、処理が正常に終わればコミット、処理に異常が発生したらロールバックしています。
www.otsuka-shokai.co.jp
更新対象のデータが存在するレコードを、SELECT FOR UPDATEでロックしています。

意識していませんでしたが、SELECT FOR UPDATEで行ロックを 行うと、読み取りも排他されるようです。
www.postgresql.jp

処理を開始したという値を、SELECT FOR UPDATEでロックした行のカラムに更新しているので、SQLクライアントでデータが更新されるのを確認していました。
値が更新されているはずなのに、更新された値が表示されず、なぜだろうと何度もSELECTを実行していると、処理を終了したという値が表示されました。

なぜ更新されないのだろう?と不思議に思いながら、処理を開始したという値への更新処理の位置を変えても、同じ結果でした。

データベース操作
Photo by Mikhail Fesenko on Unsplash

トランザクション処理を行って、データベースを更新するプログラムを、別のプログラムから呼び出しています。
別のプログラムにおいて、呼び出す直前に、データベースの更新を行うようにしたら、トランザクション処理、ロックを行っていないので、SQLクライアントでデータが更新されたのを確認できました。

処理中に値を更新して、参照したいのであれば、トランザクション処理を行っていない状態での更新が必要と理解しました。