83754


たまに仕事のコードでカラムにロック用のフラグを作成しているのを見ます。

`process: bool` みたいなカラムです。

`true` への `update` が成功したらロックが取れて、成功しなかったらフラグが取れないとみなします。

ORマッパーが用意しているロック系のメソッドを使えば、ロックが取れるまで待ってくれますが、このようなカラムを使うメリットはなんでしょうか？


CC BY-SA 4.0
2021-11-19T12:23:59.023
83721
2021-11-22T00:56:07.987
10865
question
sql database
テーブルにロックを取得するためのカラムを追加する理由を教えてください


データベースには多くの場合[トランザクションとロック機構](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B6%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)が備わっています。しかし、そのロック機構を使わない[楽観的並行性制御（楽観的ロック）](https://ja.wikipedia.org/wiki/%E6%A5%BD%E8%A6%B3%E7%9A%84%E4%B8%A6%E8%A1%8C%E6%80%A7%E5%88%B6%E5%BE%A1)という手法も存在します。

その上で、質問のようにロックを行うフラグカラムを追加する理由としては、楽観的ロックを用いながら部分的に簡易的な悲観的ロックを実現するための手段かと思われます。

メリットは楽観的ロックを多用する者にとって追加知識なしに安易に実現できることでしょうか。


CC BY-SA 4.0
2021-11-20T01:39:22.257
83725
2021-11-20T01:39:22.257
4236
83721
answer


今回のロック方式が楽観的ロックであるという立場に基づいて回答します。

楽観的ロックを使うメリットとしては、

アクセス禁止の処理を入れる必要がないかつロック解放の通知が必要ない  
つまりロック待ちという状態が起きないということになります。

ロックが取れなかった場合即時でエラーを返すのでプロセスの管理がしやすく、  
たとえばWebアプリとかですと、プロジェクトの性能の指数に0.5秒以内に返すという制約があったりすると、ロック待ちの時間は管理が難しくなります。そうなると非同期処理やバッチ処理など別の方法でロックを利用することになりますが、楽観的ロックであれば取れたら処理で取れなきゃエラーになります。制約を回避することが可能です。

ただし、頻繁に更新が発生しない処理であること、また処理の順番を維持する要件でないことが条件です。頻繁に更新が発生してしまうと、いくらロック取得の処理を投げても、なかなかロックが取れず、結果的に更新ができない可能性があります。それを回避するには悲観的ロックでないと実装は難しいでしょう。

また昨今のRDBSやフレームワークはそれぞれで悲観的ロックが実装されているものもあり、我々がロックの解放漏れとかデッドロックの検知など再開発する必要はないことが多いので、とりあえず悲観的ロックで実装に進むことも多いです。とはいえロックの制御やコネクションタイムアウトの管理などを考えるといささか楽観的ロックのほうが実装運用が楽かな？という気がします。


CC BY-SA 4.0
2021-11-22T00:56:07.987
83754
2021-11-22T00:56:07.987
22665
83721
answer