[Zope-dev] transaction support for ordering transactions.

Anthony Baxter Anthony Baxter <anthony@interlink.com.au>
Wed, 07 Jun 2000 09:38:41 +1000


>>> "Phillip J. Eby" wrote
> There is an error in your patch, however. _prepend should use
> self._objects.insert(0,object), as the way you're doing it now will break
> the _append method.  (Because _append is a reference to _objects.append,
> and you're replacing the old _objects with a new list.  Subsequent calls to
> _append will append the object to the old _objects list, not the new one
> you've just added.)  

Darn. That'll teach me to make a quick patch like this. Still, getting the
feedback is the key thing - I wasn't sure if the approach I was taking was
the right one.

> There is also a *second* problem with your patch, which is more serious and
> less correctable.  If a _prepend takes place *during* a commit operation,
> the current implementation of the commit operation will be blown all to

Ugh. Ok, how about then just doing something like not allowing a prepend
once the committings already started?

> Anyway...  I'm very much in favor of solving the same problem that you
> are...  But it requires a rather more complex patch (so that
> transaction.commit() could deal with prepends during commit) and first we'd
> need to convince Jim that it's the right thing to do.  :)  (Not only that,
> but he might come up with a better way to do it than prepending...)

He does tend to do that. I'd very much like a way to fix this - at the
moment, the only workaround for me is for SQLSessions to have an entirely
different database connection to themselves.

> Ironically, I'm not sure your problem actually *needs* this fix to be
> solved.  You probably need to tie your session object's behavior to an
> earlier transaction event (the "_p_jar.commit()" operation rather than
> tpc_finish()), and you can then be guaranteed that the SQL connection has
> not yet seen a tpc_finish() either.

I'm not sure I understand this - are you suggesting hooking it to the 
database connector's commit?

> *My* problem, on the other hand, is that even if I do this, ZODB does not
> allow objects to be _p_jar.commit()ed twice; if you modify an object which
> has already been _p_jar.commit()ed in the same transaction, you will get an
> unresolvable ConflictError (because the ZODB thinks another transaction
> modified the object before you). 

Ugh. Nasty nasty. But hey, isn't the whole point of ZPatterns to expose 
all the nasty corners of the Zope innards to light?

> Thus, I need to ensure that DataManagers
> which are saving things up 'till a _p_jar.commit() operation, get
> registered ahead of any modification to an object that they might need to
> modify again later.  So a fully functional "prepend" capability would be of
> great benefit to ZPatterns, but I'm not sure that your problem actually
> needs it, and your patch, unfortunately, does not achieve it.

Thanks for the feedback - time for me to hit the source code again. :)

Anthony