[Zope-dev] [ZODB-Dev] transaction as context manager, exception during commit

Laurence Rowe l at lrowe.co.uk
Thu Feb 24 06:38:59 EST 2011


On 24 February 2011 10:17, Chris Withers <chris at simplistix.co.uk> wrote:
> Hi Jim,
>
> The current __exit__ for transaction managers looks like this:
>
>     def __exit__(self, t, v, tb):
>         if v is None:
>             self.commit()
>         else:
>             self.abort()
>
> ..which means that if you're using the transaction package as a context
> manager and, say, a relational database integrity constraint is
> violated, then you're left with a hosed transaction that still needs
> aborting.
>
> How would you feel about the above changing to:
>
>     def __exit__(self, t, v, tb):
>         if v is None:
>             try:
>                 self.commit()
>             except:
>                 self.abort()
>                 raise
>         else:
>             self.abort()
>
> If this is okay, I'll be happy to write the tests and make the changes
> provided someone does a release when I have...

Looking at the way ZPublisher handles this, I think you're right. I
think you might also need to modify the __exit__ in Attempt, which
additionally handles retrying transactions that fail.

Laurence


More information about the Zope-Dev mailing list