As I understand the term, use of detect_record_change is actually optimistic 
locking. When User 1 loads an update form, User 2 can still read the 
existing record and even load their own update form. However, if User 2 ends 
up updating the record before User 1 submits the form, then User 1's form 
submission will fail. Note, nothing is actually locked at the database level 
-- this is all done via SQLFORM (hence still a small possibility of a race 
condition).

Anthony

On Friday, September 23, 2011 7:34:43 PM UTC-4, Cliff wrote:
>
> That would be a way to do pessimistic locking. 
>
> Of course I'm assuming DAL uses optimistic locking as it is sufficient 
> 99% of the time. 
>
> On Sep 23, 5:39 pm, Anthony <abas...@gmail.com> wrote: 
> > You can also do: 
> > 
> > form.accepts(..., detect_record_change=True) 
> > 
> > and the update will fail if the record has changed in the DB since the 
> form 
> > was originally loaded (the original record is hashed and used as the 
> formkey 
> > and then compared to the DB record again right before update -- I suppose 
>
> > there's still a slight chance of a race condition). In this case, your 
> > method is probably better because different users would be updating 
> > different fields, so no reason to force a failure. 
> > 
> > Anthony 
> > 
> > On Friday, September 23, 2011 5:14:01 PM UTC-4, Alex wrote: 
> > 
> > > thanks for the response! I already thought about using dbio=False 
> > > parameter, with the update_record method this should now be quite 
> > > easy. 
> > 
> > > explanation why it's important for me: in my scenario the auth_user 
> > > table has many additional fields (address, bank account information, 
> > > etc.), all these settings can only be changed by an admin user. only 
> > > the password can be modified by the user itself. If both the admin and 
> > > the user edit the same record at a time, the last one who saves it 
> > > would overwrite the previous changes. If I only update the fields 
> > > which are shown in the form then both users cannot overwrite the 
> > > changes of each other. I'm also performing optimistic locking (with a 
> > > version nr.) but in this case it is not necessary because both users 
> > > modify different fields. 
> > 
> > > On 23 Sep., 22:13, DenesL <den...@yahoo.ca> wrote: 
> > > > It is not a bug. Quoting the book: 
> > > > When a Field is marked with writable=False, the field is not shown in 
>
> > > > create forms, and it is shown readonly in update forms. If a field is 
>
> > > > marked as writable=False and readable=False, then the field is not 
> > > > shown at all, not even in update forms. 
> > 
> > > > This has nothing to do with the auto-(update, insert or delete) 
> > > > operations performed by form.accepts 
> > 
> > > > To update only the setting1 field you can do: 
> > 
> > > > def edit1(): 
> > > >     id = request.args(0) 
> > > >     db.mytable.setting2.readable = db.mytable.setting2.writable = 
> > > > False 
> > > >     row = db.mytable(id) 
> > > >     form=SQLFORM(db.mytable, row) 
> > > >     if form.accepts(request.vars, formname='mytable_form', 
> > > > dbio=False): 
> > > >         row.update_record(**form.vars) 
> > > >         logger.debug(db._lastsql) 
> > > >     return dict(form=form) 
> > 
> > > > as explained in: 
> > >http://web2py.com/book/default/chapter/07#SQLFORM-without-database-IO 
> > 
> > > > but it really makes no difference, except for some IO, the resulting 
> > > > database record will be identical in both cases, so why bother?. 
> > 
> >

Reply via email to