I imagine this gets ugly when autoflush is disabled... perhaps that is why 
it requires populate_existing()?

On Tuesday, March 5, 2013 10:00:36 AM UTC-5, Kent wrote:
>
> By design, when a query() fetches an existing object, it doesn't refresh 
> the values unless populate_existing() is included with the query.  The 
> documentation for populate_existing() states it isn't meant for general 
> purpose.
>
> Occasionally, however, objects need to be selected FOR UPDATE, 
> with_lockmode('update'), to guarantee against timing problems with 
> concurrent database users, particularly when the record fetched is used as 
> a base for the update.  For example, if I need to update a record's 
> quantity field by a delta of +5, it is extremely important that I have the 
> most recent Object.quantity datum; truly, that was the reason I used 
> with_lockmode('update') in the first place.
>
> I get uneasy to think that the user needs to remember to invoke 
> populate_existing() when selecting a record FOR UPDATE to guard against the 
> possibility that there is a stale version of the instance in the session.
>
> I will likely add that to our framework's Query subclass, but thought you 
> might consider the implications here. Generally, sqla is extremely 
> optimistic regarding locks, but in the event when the user is specifying 
> with_lockmode('update'), we've left the realm of optimistic locking and 
> entered pessimistic, so it seems reasonable to consider automatically 
> enforcing populate_existing() when with_lockmode('update') is used?  
>
> Something to consider; I'd be interested in your thoughts.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to