populate_existing() blows away any pending changes on the object so turning it 
on by default would be a surprise in a lot of cases.

typically if someone is working with FOR UPDATE they're already programming a 
very specific section in a very careful manner, it's not something that's done 
casually.  I would think that it would be used to select a row right at the 
start of a transaction, that is definitely not already in the Session.

in my own experience, any time I've actually tried to work with pessimistic 
locking my application ends up deadlocking at 2 AM, so I can't say I have the 
background to really say how this method should be used.  At this point, a 
documentation note is certainly something doable (because I would hope very 
much that anyone using this method has read the documentation carefully).




On Mar 5, 2013, at 10:00 AM, Kent <jkentbo...@gmail.com> 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.
>  
>  

-- 
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