diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-14 15:50:40 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-14 15:50:40 +0000 |
commit | 53faada96c484b11b7a4632dc061dbce3661dbbe (patch) | |
tree | 0207994aee90b7f9fcff16d30fb3f365e0b45bb3 | |
parent | 0642dcb796313118dd81c3d12e044b4128c2746d (diff) | |
download | sqlalchemy-53faada96c484b11b7a4632dc061dbce3661dbbe.tar.gz |
fixed nested rollbacks
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 2 | ||||
-rw-r--r-- | test/engine/transaction.py | 36 |
2 files changed, 32 insertions, 6 deletions
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index dafef729a..d9e3f4ed8 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -361,7 +361,7 @@ class Transaction(object): is_active = property(lambda s:s.__is_active) def rollback(self): if not self.__parent.__is_active: - raise exceptions.InvalidRequestError("This transaction is inactive") + return if self.__parent is self: self.__connection._rollback_impl() self.__is_active = False diff --git a/test/engine/transaction.py b/test/engine/transaction.py index a06701ff3..b8f8af96e 100644 --- a/test/engine/transaction.py +++ b/test/engine/transaction.py @@ -36,6 +36,36 @@ class TransactionTest(testbase.PersistTest): connection.close() @testbase.unsupported('mysql') + def testnestedrollback(self): + connection = testbase.db.connect() + + try: + transaction = connection.begin() + try: + connection.execute(users.insert(), user_id=1, user_name='user1') + connection.execute(users.insert(), user_id=2, user_name='user2') + connection.execute(users.insert(), user_id=3, user_name='user3') + trans2 = connection.begin() + try: + connection.execute(users.insert(), user_id=4, user_name='user4') + connection.execute(users.insert(), user_id=5, user_name='user5') + raise Exception("uh oh") + trans2.commit() + except: + trans2.rollback() + raise + transaction.rollback() + except Exception, e: + transaction.rollback() + raise + except Exception, e: + try: + assert str(e) == 'uh oh' # and not "This transaction is inactive" + finally: + connection.close() + + + @testbase.unsupported('mysql') def testnesting(self): connection = testbase.db.connect() transaction = connection.begin() @@ -206,19 +236,15 @@ class TLTransactionTest(testbase.PersistTest): mapper(User, users) sess = create_session(bind_to=tlengine) - print "STEP1" tlengine.begin() - print "STEP2" u = User() sess.save(u) - print "STEP3" sess.flush() - print "STEP4" tlengine.commit() - print "STEP5" finally: clear_mappers() + def testconnections(self): """tests that contextual_connect is threadlocal""" c1 = tlengine.contextual_connect() |