[Rails] Re: When to use optimistic locking?

Kevin Olbrich
2006-05-09T18:33:15Z

On Tuesday, May 09, 2006, at 8:18 PM, Jason Tuttle
wrote:
>Jason Tuttle wrote:
>> Hi All,
>>
>> I''m having some trouble deciding when and how to implement
optimistic
>> locking.
>>
>> Let''s say I have a multiuser Rails app, and let''s say
it stores,
>> among other things "vital" customer information.
>>
>> The standard methods created by the Rails generate scaffold script
>> look like this:
>>
>>    def edit
>>      @customer = Customer.find(params[:id])
>>    end
>>
>>    def update
>>      @customer = Customer.find(params[:id])
>>      if @customer.update_attributes(params[:customer])
>>        flash[:notice] = ''Customer was successfully
updated.''
>>        redirect_to :action => ''show'', :id =>
@customer
>>      else
>>        render :action => ''edit''
>>      end
>>    end
>>
>> What if I want to guard against 2 people simultaneously updating the
>> same customer record? How would I go about doing this? I can''t
find
>> any examples online, and I''m a bit lost.
>>
>> Thanks,
>>
>> : )
>>
>> Jason
>
>The more I think about it, there doesn''t seem to be a way to take
>advantage of Active Record''s  optimistic locking when using the
standard
>scaffold generated CRUD approach because the model state is lost between
>the call to "edit" and the subsequent call to "update".
-- The
>ActiveRecord::StaleObjectError will never be thrown.
>
>Do you have to manually track the value of the lock_version column?
>
>There must be a more elegant solution.
>
>I must be missing something. I just can''t figure out what.
>
>- Jason
>
>--
>Posted via http://www.ruby-forum.com/.
>_______________________________________________
>Rails mailing list
>Rails@lists.rubyonrails.org
>http://lists.rubyonrails.org/mailman/listinfo/rails

It works.  I think it puts a hidden text field with the value of the
lock_version in the form.  When you go to save it, it compares the value
to the one in the database.  If the one in the database is different,
then someone has modified the record.  Once saved, the value is incremented.

So the state of the record is retained.  I think AR is smart enough to
know what to do with this without adding additional code, which is why
they call it a ''magic'' column.

_Kevin

--
Posted with http://DevLists.com.  Sign up and save your mailbox.