Active Recordには、楽観的ロックと悲観的ロックの2通りのロックがある。
Railsの楽観的ロックが他の楽観的ロックと異なる点は、lock_versionというカラムを用いて楽観的ロックを行う点である。
悲観的ロックは、他の言語と同じである。
楽観的ロック
複数のユーザーが同じレコードを編集する事を許容するロック。
レコードが変更されたかどうかをチェックする仕組みになっている。
更新されたが無視された場合、ActiveRecord::StaleObjectError例外が発生する。
楽観的ロックカラム
楽観的ロックを使用するにあたって、テーブルにlock_versionというinteger型のカラムを作成する必要がある。
レコードが更新されるたびに、lock_versionカラムの値を1ずつ増やす。
更新リクエストが発生した時のlock_versionの値がDB上のlock_versionカラムの値よりも小さい場合、更新リクエストは失敗し、ActiveRecord::StaleObjectErrorが発生する。
def change
~
t.integer :lock_version, default: 0
end
悲観的ロック
データベースが提供するロック機能を利用する。
悲観的ロックでは、他ユーザーが更新対象のデータを取得できないようにロックがかかる。
そして、ロックはデータの更新が完了するまで解除されない。
Railsガイド
https://railsguides.jp/active_record_querying.html
lock_versionを使って排他制御(楽観的ロック)を行う方法
https://pote-chil.com/rails_optimistic/
排他制御について(楽観的ロック・悲観的ロック )
https://www.ryotaku.com/entry/2019/08/07/000000