From: Mike Bayer Date: Tue, 12 Jul 2011 23:34:25 +0000 (-0400) Subject: - Context manager provided by Connection.begin() X-Git-Tag: rel_0_7_2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7bb2adfff90f989d45cbcb6f306d8d9d82298816;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Context manager provided by Connection.begin() will issue rollback() if the commit() fails, not just if an exception occurs. --- diff --git a/CHANGES b/CHANGES index cd2577fe94..5734405523 100644 --- a/CHANGES +++ b/CHANGES @@ -69,6 +69,10 @@ CHANGES from the default. [ticket:2209] - engine + - Context manager provided by Connection.begin() + will issue rollback() if the commit() fails, + not just if an exception occurs. + - Use urllib.parse_qsl() in Python 2.6 and above, no deprecation warning about cgi.parse_qsl() [ticket:1682] diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 3cfe800814..04c14c2b7e 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -1979,11 +1979,14 @@ class Transaction(object): def __exit__(self, type, value, traceback): if type is None and self.is_active: - self.commit() + try: + self.commit() + except: + self.rollback() + raise else: self.rollback() - class RootTransaction(Transaction): def __init__(self, connection): super(RootTransaction, self).__init__(connection, None) diff --git a/test/engine/test_transaction.py b/test/engine/test_transaction.py index 1184befda9..344a30734b 100644 --- a/test/engine/test_transaction.py +++ b/test/engine/test_transaction.py @@ -159,6 +159,28 @@ class TransactionTest(fixtures.TestBase): assert len(result.fetchall()) == 0 connection.close() + def test_with_interface(self): + connection = testing.db.connect() + trans = connection.begin() + connection.execute(users.insert(), user_id=1, user_name='user1') + connection.execute(users.insert(), user_id=2, user_name='user2') + try: + connection.execute(users.insert(), user_id=2, user_name='user2.5') + except Exception, e: + trans.__exit__(*sys.exc_info()) + + assert not trans.is_active + self.assert_(connection.scalar('select count(*) from ' + 'query_users') == 0) + + trans = connection.begin() + connection.execute(users.insert(), user_id=1, user_name='user1') + trans.__exit__(None, None, None) + assert not trans.is_active + self.assert_(connection.scalar('select count(*) from ' + 'query_users') == 1) + connection.close() + def test_close(self): connection = testing.db.connect() transaction = connection.begin()