On Jul 25, 2014, at 7:16 PM, Claudio Freire <klaussfre...@gmail.com> wrote:
> On Fri, Jul 25, 2014 at 7:55 PM, Michael Bayer <mike...@zzzcomputing.com> > wrote: >> Don't objects potentially have this problem anyway, in the sense that if >> they are accessed TWICE after a commit, the second access will use the data >> cached from the first, and could again be out of date? >> >> >> only if you have a low transaction isolation level set up. The Session >> tries to make a choice as to the most reasonable place that concurrent >> changes should be anticipated. Transaction demarcations are the best place. >> If you are expecting to code your app to specifically expect READ COMMITTED >> or READ UNCOMMITTED behavior where your transaction relies upon seeing a row >> change value from a concurrent transaction, that's a special use case, in >> which case you can use expire() for those object that have this requirement. >> The ORM Session can obviously not guess when such an expiration is to be >> detected otherwise. > > > I don't see how transaction isolation levels relate to this. > > The effect of disabling expire_on_commit is that of not seeing > subsequent commits. It would be a fictious DO NOT READ COMMITTED > level. Having it on, somewhat caters to possible SERIALIZED settings, > where strict ordering is to be expected, since without serialized > transactions there's no way expiring helps correctness in any way. > None of those seem overly common to me, so I don't see how one can > ignore the serialization level in effect or possible concurrent > updates that are happening at the same time, with or without > expire_on_commit. yes, it caters the most to SERIALIZED settings, a little bit less so to REPEATABLE READ (works for individual objects but not collections), then still less to READ COMMITTED (works only to the extent that you're worried about other transactions in progress), etc. > > IMHO, expire_on_commit is something that really has no sensible > default. You pick your own, the library authors pick one default > because, well, why not? So, for a long time, all through 0.4, the default was, "never, and not even possible". There was no expire on commit, at that time I thought it was insane to throw away all that great data that you've loaded unless you absolutely want to. As it turns out the current defaults are not by accident! We had a pretty steady parade of users who complained that their data was stale, and for years I scratched my head, how are we do to this? just blow away all objects all the time on every query? that seemed so wrong, so wasteful, and of course so complicated since we would want pending changes to remain around. As I've written many times, it was the Storm ORM that introduced me to the concept of "expire on commit". The linkage to the transaction is also kind of where Hibernate and JSR 220 is coming from, though not necessarily wiping out the object on commit...the spec doesn't make that aspect very clear. Overall the "expire on commit" idea is very strict and assumes entities are row proxies only. > For the record, I'm using expire_on_commit=off, because I also use > model instances outside the scope of their originating transaction. > I've had no problems with it, but I did have to be very careful with > the semantics and lifetime of those objects, and of expiring manually > anything I put on concurrently-accessed structures, lest someone > modify it before the session's scope is over and it gets (or tries to > be) committed to the DB. Maybe "expire on begin" might be useful. So your data is still there after commit, but if you start a new transaction, then things refresh. I'm up for it in a 1.0 release, if you think it's useful. Though explaining to everyone another option...what a PITA.... > -- 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. For more options, visit https://groups.google.com/d/optout.