From a88e4c9a2b6a268afbfb1c70ba5bcca58393409d Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 12 Sep 2006 20:06:42 +0000 Subject: [PATCH] - fixed bug where Connection wouldnt lose its Transaction after commit/rollback --- CHANGES | 2 ++ lib/sqlalchemy/engine/base.py | 2 ++ test/engine/transaction.py | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/CHANGES b/CHANGES index b0d75ea72f..67a359b319 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,8 @@ arguments into a for_update argument on the select side. - implemented "version check" logic in Query/Mapper, used when version_id_col is in effect and query.with_lockmode() is used to get() an instance thats already loaded +- fixed bug where Connection wouldnt lose its Transaction +after commit/rollback 0.2.8 - cleanup on connection methods + documentation. custom DBAPI diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index ce6cc7d82e..fad84eef86 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -211,10 +211,12 @@ class Connection(Connectable): if self.__engine.echo: self.__engine.log("ROLLBACK") self.__engine.dialect.do_rollback(self.connection) + self.__transaction = None def _commit_impl(self): if self.__engine.echo: self.__engine.log("COMMIT") self.__engine.dialect.do_commit(self.connection) + self.__transaction = None def _autocommit(self, statement): """when no Transaction is present, this is called after executions to provide "autocommit" behavior.""" # TODO: have the dialect determine if autocommit can be set on the connection directly without this diff --git a/test/engine/transaction.py b/test/engine/transaction.py index 6711af8b8a..c2d278b6a2 100644 --- a/test/engine/transaction.py +++ b/test/engine/transaction.py @@ -21,6 +21,22 @@ class TransactionTest(testbase.PersistTest): def tearDownAll(self): users.drop(testbase.db) + def testcommits(self): + connection = testbase.db.connect() + transaction = connection.begin() + connection.execute(users.insert(), user_id=1, user_name='user1') + transaction.commit() + + transaction = connection.begin() + connection.execute(users.insert(), user_id=2, user_name='user2') + connection.execute(users.insert(), user_id=3, user_name='user3') + transaction.commit() + + transaction = connection.begin() + result = connection.execute("select * from query_users") + assert len(result.fetchall()) == 3 + transaction.commit() + @testbase.unsupported('mysql') def testrollback(self): """test a basic rollback""" @@ -157,6 +173,22 @@ class TLTransactionTest(testbase.PersistTest): finally: external_connection.close() + def testcommits(self): + connection = tlengine.contextual_connect() + transaction = connection.begin() + connection.execute(users.insert(), user_id=1, user_name='user1') + transaction.commit() + + transaction = connection.begin() + connection.execute(users.insert(), user_id=2, user_name='user2') + connection.execute(users.insert(), user_id=3, user_name='user3') + transaction.commit() + + transaction = connection.begin() + result = connection.execute("select * from query_users") + assert len(result.fetchall()) == 3 + transaction.commit() + @testbase.unsupported('mysql') def testrollback_off_conn(self): # test that a TLTransaction opened off a TLConnection allows that -- 2.47.2