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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.