From 82edfd0e915717dbc93d53247e5f2515ac5dd474 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 26 Feb 2008 19:32:49 +0000 Subject: [PATCH] - implemented two-phase API for "threadlocal" engine, via engine.begin_twophase(), engine.prepare() [ticket:936] --- CHANGES | 4 ++++ lib/sqlalchemy/engine/threadlocal.py | 16 +++++++--------- test/engine/transaction.py | 26 ++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/CHANGES b/CHANGES index 63dfbd2697..460244b05b 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,10 @@ CHANGES raise a catchable data error during results (i.e. doesn't work on MySQL) [ticket:978] + - implemented two-phase API for "threadlocal" engine, + via engine.begin_twophase(), engine.prepare() + [ticket:936] + - orm - any(), has(), contains(), attribute level == and != now work properly with self-referential relations - the clause diff --git a/lib/sqlalchemy/engine/threadlocal.py b/lib/sqlalchemy/engine/threadlocal.py index d07d8da835..e4b2859dc5 100644 --- a/lib/sqlalchemy/engine/threadlocal.py +++ b/lib/sqlalchemy/engine/threadlocal.py @@ -38,17 +38,9 @@ class TLSession(object): def prepare(self): if self.__tcount == 1: - try: - self.__trans._trans.prepare() - finally: - self.reset() + self.__trans._trans.prepare() def begin_twophase(self, xid=None): - raise NotImplementedError( - "Two phase transactions not yet implemented for 'threadlocal' " - "strategy") - - def _dont_begin_twophase(self, xid=None): if self.__tcount == 0: self.__transaction = self.get_connection() self.__trans = self.__transaction._begin_twophase(xid=xid) @@ -189,9 +181,15 @@ class TLEngine(base.Engine): return self.session.get_connection(**kwargs) + def begin_twophase(self, **kwargs): + return self.session.begin_twophase(**kwargs) + def begin(self, **kwargs): return self.session.begin(**kwargs) + def prepare(self): + self.session.prepare() + def commit(self): self.session.commit() diff --git a/test/engine/transaction.py b/test/engine/transaction.py index b409703711..9cf13e6932 100644 --- a/test/engine/transaction.py +++ b/test/engine/transaction.py @@ -699,6 +699,32 @@ class TLTransactionTest(TestBase): c2.close() assert c1.connection.connection is not None + @testing.unsupported('sqlite', 'mssql', 'firebird', 'sybase', 'access', + 'oracle', 'maxdb') + @testing.exclude('mysql', '<', (5, 0, 3)) + def testtwophasetransaction(self): + tlengine.begin_twophase() + tlengine.execute(users.insert(), user_id=1, user_name='user1') + tlengine.prepare() + tlengine.commit() + + tlengine.begin_twophase() + tlengine.execute(users.insert(), user_id=2, user_name='user2') + tlengine.commit() + + tlengine.begin_twophase() + tlengine.execute(users.insert(), user_id=3, user_name='user3') + tlengine.rollback() + + tlengine.begin_twophase() + tlengine.execute(users.insert(), user_id=4, user_name='user4') + tlengine.prepare() + tlengine.rollback() + + self.assertEquals( + tlengine.execute(select([users.c.user_id]).order_by(users.c.user_id)).fetchall(), + [(1,),(2,)] + ) class ForUpdateTest(TestBase): def setUpAll(self): -- 2.47.3