[Checkins] SVN: z3c.zalchemy/trunk/s Moving forward with better transaction integration.

Christian Theune ct at gocept.com
Fri Jan 25 08:45:03 EST 2008


Log message for revision 83232:
  Moving forward with better transaction integration.
  

Changed:
  U   z3c.zalchemy/trunk/setup.py
  U   z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py

-=-
Modified: z3c.zalchemy/trunk/setup.py
===================================================================
--- z3c.zalchemy/trunk/setup.py	2008-01-25 06:45:16 UTC (rev 83231)
+++ z3c.zalchemy/trunk/setup.py	2008-01-25 13:45:03 UTC (rev 83232)
@@ -20,7 +20,7 @@
       include_package_data = True,
       zip_safe=False,
       install_requires=['setuptools',
-                        'SQLAlchemy>=0.4',
+                        'SQLAlchemy>=0.4.2p4dev',
                         'ZODB3',
                         'zope.component',
                         'zope.interface',

Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py	2008-01-25 06:45:16 UTC (rev 83231)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py	2008-01-25 13:45:03 UTC (rev 83232)
@@ -29,9 +29,11 @@
 
 from sqlalchemy.orm import scoped_session, sessionmaker
 
+
 class AlchemyEngineUtility(persistent.Persistent):
     """A utility providing a database engine.
     """
+
     implements(z3c.zalchemy.interfaces.IAlchemyEngineUtility)
 
     def __init__(self, name, dsn, echo=False, encoding='utf-8',
@@ -205,11 +207,14 @@
         self.session = session
 
     def abort(self, trans):
-        self.session.rollback()
-        self._cleanup()
+        self._abort()
 
     def commit(self, trans):
+        # Flush instructions to the database (because of conflict integration)
         self._flush_session()
+        # Commit any nested transactions (savepoints)
+        while self.session.transaction.nested:
+            self.session.commit()
 
     def tpc_begin(self, trans):
         pass
@@ -222,8 +227,7 @@
         self._cleanup()
 
     def tpc_abort(self, trans):
-        self.session.rollback()
-        self._cleanup()
+        self._abort()
 
     def sortKey(self):
         return str(id(self))
@@ -231,11 +235,18 @@
     def savepoint(self):
         self._flush_session()
         transaction = self.session.begin_nested()
+        self._flush_session()
         return AlchemySavepoint(transaction, self.session)
 
     def _cleanup(self):
         Session.remove()
 
+    def _abort(self):
+        while self.session.transaction.nested:
+            self.session.transaction.close()
+        self.session.rollback()
+        self._cleanup()
+
     def _flush_session(self):
         try:
             self.session.flush()



More information about the Checkins mailing list