On 24 February 2011 10:17, Chris Withers <chris@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