[ZODB-Dev] Re: Savepoints are invalidated once they are used

Christian Heimes christian at cheimes.de
Mon Jul 11 21:11:03 EDT 2005


Tim Peters wrote:
>>Today I stumbled over an unexpected behavior of savepoints. As far as I'm
>>able to understand savepoints they mark a well defined state in the
>>middle of a transaction.
>>A savepoint is invalid if its transaction is committed
>>or another savepoint is created.
> 
> 
> No, that's not the intent.  Savepoints are intended to act like a stack.
> Each time you make a savepoint, it (in effect) pushes the current state on
> the stack.  You can roll back to any state on the stack, and doing so makes
> all the savepoints "at and after" the one you rolled back to unusable, but
> leaves the ones "before" it still usable.  Like so:

[snip]

>>Well nesting savepoints would be a nice feature but I can live w/o it.
> 
> 
> Nesting is very much an intended use case.  If you don't think it works,
> show some code (maybe there's a bug not provoked by the pattern above). 

[snip]

Nesting savepoints works according to your test and I really believe you 
that they work in real live. Honestly! :)
But there is some evil code in transaction/ that is destroying 
savepoints for my use case. Committing a subtransaction using the old 
and deprecated transaction.commit(1) syntax is invalidating all 
savepoints. The invalidation would be harmless but the zcatalog has a 
nasty feature. It is committing a subtransaction + GC cleanup after 
cataloging n object in a transaction. IIRC n=10,000 by default which 
might be reached much earlier than one can imagine.

The bad code:

class Transaction(object):

     [...]

     def commit(self, subtransaction=False):

         if self._savepoint2index:
             self._invalidate_all_savepoints()

         if subtransaction:
             # TODO deprecate subtransactions
             self._subtransaction_savepoint = self.savepoint(1)
             return

         [...]

What about altering the order of the two if statements? IMO there is no 
need to invalidate all savepoints when creeating a subtransaction.

Tim? Jim?

Christian



More information about the ZODB-Dev mailing list