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で受け付ける質問は実行しないので無保証です。ご注意ください。