summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-06-14 15:50:40 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-06-14 15:50:40 +0000
commit53faada96c484b11b7a4632dc061dbce3661dbbe (patch)
tree0207994aee90b7f9fcff16d30fb3f365e0b45bb3
parent0642dcb796313118dd81c3d12e044b4128c2746d (diff)
downloadsqlalchemy-53faada96c484b11b7a4632dc061dbce3661dbbe.tar.gz
fixed nested rollbacks
-rw-r--r--lib/sqlalchemy/engine/base.py2
-rw-r--r--test/engine/transaction.py36
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()