diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-07 18:31:35 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-11-07 18:31:35 +0000 |
commit | af070d037ba4b0787e7bd74add6e5aba04f144d3 (patch) | |
tree | 7a2e8ab3bb9736680066fa17cba8b35638f55415 | |
parent | c1a9a96ba541c8ec12864259dd2f076ef6e056c8 (diff) | |
download | sqlalchemy-af070d037ba4b0787e7bd74add6e5aba04f144d3.tar.gz |
- fixed the close() method on Transaction when using strategy='threadlocal'
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/base.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/engine/threadlocal.py | 9 | ||||
-rw-r--r-- | test/engine/transaction.py | 28 |
4 files changed, 39 insertions, 4 deletions
@@ -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""" |