[Zope-Checkins] CVS: Zope/lib/python/Shared/DC/ZRDB - TM.py:1.9

Kapil Thangavelu k_vertigo@yahoo.com
Mon, 11 Mar 2002 17:05:14 -0500


Update of /cvs-repository/Zope/lib/python/Shared/DC/ZRDB
In directory cvs.zope.org:/tmp/cvs-serv18379

Modified Files:
	TM.py 
Log Message:
Changes 

  1. Fixes a bug in the TM whereby tpc_abort was ignored. this
     was the likely cause of external transaction manager's never
     recieving a commit or abort statement and hanging because
     they could never register again for a transaction.

  2. Works around a bug in Zope's transaction machinery. This
     bug is a corner case. it would cause loss of data integrity
     if a external transaction manager were involved in a
     zope transaction that involved a subtransaction commit, in
     which the overall transaction was aborted.




=== Zope/lib/python/Shared/DC/ZRDB/TM.py 1.8 => 1.9 ===
                 get_transaction().register(Surrogate(self))
                 self._begin()
-                self._registered=1
+                self._registered = 1
+                self._finalize = 0
             except: pass
 
     def tpc_begin(self, *ignored): pass
-    commit=tpc_abort=tpc_begin
+    commit=tpc_begin
 
     def _finish(self):
         self.db.commit()
@@ -46,13 +47,20 @@
     def _abort(self):
         self.db.rollback()
 
+    def tpc_vote(self, *ignored):
+        self._finalize = 1
+
     def tpc_finish(self, *ignored):
-        try: self._finish()
-        finally: self._registered=0
+
+        if self._finalize:	
+            try: self._finish()
+            finally: self._registered=0
 
     def abort(self, *ignored):
         try: self._abort()
         finally: self._registered=0
+
+    tpc_abort = abort
 
 class Surrogate: