Railsで悲観的ロックできないの?

という質問がありました。

ActiveRecordで楽観的ロックは、ロックをかけたいModelに、lock_version という列を追加すればできます。
migrationでは、

  t.integer :lock_version, :default => 0

こんな感じ。

で、ご質問の悲観的ロックですが、findでオプションを付ければできます。

User.transaction do
  user = User.find(id, :lock => true)
  ...
  user.save!
end

トランザクションがコミットされたときに解放されます。行ロックかテーブルロックかはデータベースによります。

また、findした後にロックをかける方法もあり、

User.transaction do
  users = User.find ...
  user = users.detect {|u| u.name == "babie" }
  ...
  u.lock!
  ...
  u.save!
end

というようなこともできます。

詳しくは、ActiveRecord::Locking::Pessimisticのヘルプ をご覧ください。


それでは、Railsで楽しく開発してください!

twitterでRailsの無償サポートやってます
※ 私がtwitterで受け付ける質問は実行しないので無保証です。ご注意ください。