]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- implemented two-phase API for "threadlocal" engine,
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 26 Feb 2008 19:32:49 +0000 (19:32 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 26 Feb 2008 19:32:49 +0000 (19:32 +0000)
via engine.begin_twophase(), engine.prepare()
[ticket:936]

CHANGES
lib/sqlalchemy/engine/threadlocal.py
test/engine/transaction.py

diff --git a/CHANGES b/CHANGES
index 63dfbd26978ec381115e858a0ffbac9b2dc53b4b..460244b05b6c47b32ec7829ce4903ca52ee28ea8 100644 (file)
--- 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
index d07d8da835ba16b58761ce55940aa6078e6bf5c6..e4b2859dc50283d146fecaf0009d7bc2d7da2c53 100644 (file)
@@ -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()
 
index b409703711ffe81f413e5869137f65e3d393ed23..9cf13e6932360a30a8848e62a9f7bc9b5f27930a 100644 (file)
@@ -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):