tusbasaのブログ

業務や勉強中に調べたことを自分用にメモするブログ

【rails】楽観的ロック、悲観的ロックについて

・楽観的ロック ActiveRecordで処理が行われる。データそのものに対するロックは行わない。データの更新時にデータのバージョンを確認してデータ取得時のバージョンと一致していればデータの更新を行う。バージョンが違う場合(データ取得から更新までの間にデータが変わっている場合)例外を発生させる。save!,update!でデータの処理を行う。ロックを掛けたいテーブルにlock_versionカラムを追加する。lock_versionカラムはデータ更新時に1増える。lock_versionはフォームのパラメータとして送信する必要がある(hiddenでOK)。

・悲観的ロック DBで処理が行われる。データの取得時にデータをロックし、更新時にロックを解除する方法。データのロックはRDBMSの「SELECT 〜 FOR UPDATE」を利用して実現される。悲観的ロックではデータが更新されないとロックが開放されない為、更新されずブラウザが閉じられた際などにロックの開放漏れが起きる可能性がある。 その為以下のような対策が必要

管理者であればロックを解放できる機能を設ける ロックしているユーザであれば、ロックを再取得できるようにする ロックしているユーザのセッションタイムアウトのタイミングで、そのユーザがロックしている全てのデータのロックを解放する 長時間ロックされているデータはロック解放するような機能を設ける

参考 http://snjx.info/diary/snjx/041
https://kray.jp/blog/activerecord%E3%81%A7%E8%A1%8C%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E3%81%8B%E3%81%91%E3%82%8B%E6%96%B9%E6%B3%95/
http://blog.livedoor.jp/enjoy_baseball-advanced/archives/51527409.html
https://www.ryotaku.com/entry/2019/08/07/000000
https://qiita.com/merrill/items/d9d41d64df292bd6432a
https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc