LoginSignup
1
0

More than 1 year has passed since last update.

Railsの楽観的ロックと悲観的ロック

Posted at

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0