summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-11-07 18:31:35 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-11-07 18:31:35 +0000
commitaf070d037ba4b0787e7bd74add6e5aba04f144d3 (patch)
tree7a2e8ab3bb9736680066fa17cba8b35638f55415
parentc1a9a96ba541c8ec12864259dd2f076ef6e056c8 (diff)
downloadsqlalchemy-af070d037ba4b0787e7bd74add6e5aba04f144d3.tar.gz
- fixed the close() method on Transaction when using strategy='threadlocal'
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/engine/base.py2
-rw-r--r--lib/sqlalchemy/engine/threadlocal.py9
-rw-r--r--test/engine/transaction.py28
4 files changed, 39 insertions, 4 deletions
diff --git a/CHANGES b/CHANGES
index b84955746..9f329b1e5 100644
--- a/CHANGES
+++ b/CHANGES
@@ -39,7 +39,9 @@ CHANGES
- Added a field ("info") for storing arbitrary data on schema items
[ticket:573]
-
+
+ - fixed the close() method on Transaction when using strategy='threadlocal'
+
- orm
- eager loading with LIMIT/OFFSET applied no longer adds the primary
table joined to a limited subquery of itself; the eager loads now
diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py
index bd82f897d..f554d6a16 100644
--- a/lib/sqlalchemy/engine/base.py
+++ b/lib/sqlalchemy/engine/base.py
@@ -939,7 +939,7 @@ class Transaction(object):
method returns.
This is used to cancel a Transaction without affecting the scope of
- an enclosign transaction.
+ an enclosing transaction.
"""
if not self._parent._is_active:
return
diff --git a/lib/sqlalchemy/engine/threadlocal.py b/lib/sqlalchemy/engine/threadlocal.py
index dc6b6007f..8eb039208 100644
--- a/lib/sqlalchemy/engine/threadlocal.py
+++ b/lib/sqlalchemy/engine/threadlocal.py
@@ -76,7 +76,11 @@ class TLSession(object):
self.reset()
elif self.__tcount > 1:
self.__tcount -= 1
-
+
+ def close(self):
+ if self.__tcount == 1:
+ self.rollback()
+
def is_begun(self):
return self.__tcount > 0
@@ -138,6 +142,9 @@ class TLTransaction(base.Transaction):
def commit(self):
self._session.commit()
+ def close(self):
+ self._session.close()
+
def __enter__(self):
return self
diff --git a/test/engine/transaction.py b/test/engine/transaction.py
index f1fb99316..ca10965a5 100644
--- a/test/engine/transaction.py
+++ b/test/engine/transaction.py
@@ -384,7 +384,7 @@ class TLTransactionTest(PersistTest):
users.drop(tlengine)
tlengine.dispose()
- def testclose(self):
+ def test_connection_close(self):
"""test that when connections are closed for real, transactions are rolled back and disposed."""
c = tlengine.contextual_connect()
@@ -396,6 +396,32 @@ class TLTransactionTest(PersistTest):
assert not tlengine.session.in_transaction()
assert not hasattr(tlengine.session, '_TLSession__transaction')
assert not hasattr(tlengine.session, '_TLSession__trans')
+
+ def test_transaction_close(self):
+ c = tlengine.contextual_connect()
+ t = c.begin()
+ tlengine.execute(users.insert(), user_id=1, user_name='user1')
+ tlengine.execute(users.insert(), user_id=2, user_name='user2')
+ t2 = c.begin()
+ tlengine.execute(users.insert(), user_id=3, user_name='user3')
+ tlengine.execute(users.insert(), user_id=4, user_name='user4')
+ t2.close()
+
+ external_connection = tlengine.connect()
+ result = external_connection.execute("select * from query_users")
+ try:
+ assert len(result.fetchall()) == 4
+ finally:
+ external_connection.close()
+
+ t.close()
+
+ external_connection = tlengine.connect()
+ result = external_connection.execute("select * from query_users")
+ try:
+ assert len(result.fetchall()) == 0
+ finally:
+ external_connection.close()
def testrollback(self):
"""test a basic rollback"""