[Zodb-checkins] SVN: ZODB/trunk/src/ Added support for the transaction retry convenience

Jim Fulton jim at zope.com
Thu May 13 07:26:56 EDT 2010


Log message for revision 112272:
  Added support for the transaction retry convenience
  (transaction-manager attempts method) introduced in the
  ``transaction`` 1.1.0 release.
  

Changed:
  U   ZODB/trunk/src/CHANGES.txt
  U   ZODB/trunk/src/ZODB/POSException.py
  U   ZODB/trunk/src/ZODB/tests/testConnection.py

-=-
Modified: ZODB/trunk/src/CHANGES.txt
===================================================================
--- ZODB/trunk/src/CHANGES.txt	2010-05-13 11:10:40 UTC (rev 112271)
+++ ZODB/trunk/src/CHANGES.txt	2010-05-13 11:26:56 UTC (rev 112272)
@@ -20,6 +20,10 @@
   made moot by the introduction of multi-version concurrency control
   several years ago.
 
+- Added support for the transaction retry convenience
+  (transaction-manager attempts method) introduced in the
+  ``transaction`` 1.1.0 release.
+
 Bugs Fixed
 ----------
 

Modified: ZODB/trunk/src/ZODB/POSException.py
===================================================================
--- ZODB/trunk/src/ZODB/POSException.py	2010-05-13 11:10:40 UTC (rev 112271)
+++ ZODB/trunk/src/ZODB/POSException.py	2010-05-13 11:26:56 UTC (rev 112272)
@@ -22,6 +22,7 @@
 # BBB: We moved the two transactions to the transaction package
 from transaction.interfaces import TransactionError, TransactionFailedError
 
+import transaction.interfaces
 
 def _fmt_undo(oid, reason):
     s = reason and (": %s" % reason) or ""
@@ -67,7 +68,7 @@
         return oid_repr(self.args[0])
 
 
-class ConflictError(POSError, TransactionError):
+class ConflictError(POSError, transaction.interfaces.TransientError):
     """Two transactions tried to modify the same object at once.
 
     This transaction should be resubmitted.
@@ -234,7 +235,7 @@
         return "BTrees conflict error at %d/%d/%d: %s" % (
             self.p1, self.p2, self.p3, self.msgs[self.reason])
 
-class DanglingReferenceError(POSError, TransactionError):
+class DanglingReferenceError(POSError, transaction.interfaces.TransactionError):
     """An object has a persistent reference to a missing object.
 
     If an object is stored and it has a reference to another object
@@ -265,7 +266,7 @@
 class VersionCommitError(VersionError):
     """An invalid combination of versions was used in a version commit."""
 
-class VersionLockError(VersionError, TransactionError):
+class VersionLockError(VersionError, transaction.interfaces.TransactionError):
     """Modification to an object modified in an unsaved version.
 
     An attempt was made to modify an object that has been modified in an

Modified: ZODB/trunk/src/ZODB/tests/testConnection.py
===================================================================
--- ZODB/trunk/src/ZODB/tests/testConnection.py	2010-05-13 11:10:40 UTC (rev 112271)
+++ ZODB/trunk/src/ZODB/tests/testConnection.py	2010-05-13 11:26:56 UTC (rev 112272)
@@ -380,6 +380,37 @@
         -1
         """
 
+def test_transaction_retry_convenience():
+    """
+
+    Simple test to verify integration with the transaction retry
+    helper my verifying that we can raise ConflictError and have it
+    handled properly.
+
+    This is an adaptation of the convenience tests in transaction.
+
+    >>> db = ZODB.tests.util.DB()
+    >>> conn = db.open()
+    >>> dm = conn.root()
+
+    >>> ntry = 0
+    >>> with transaction:
+    ...      dm['ntry'] = 0
+
+    >>> import ZODB.POSException
+    >>> for attempt in transaction.manager.attempts():
+    ...     with attempt as t:
+    ...         t.note('test')
+    ...         print dm['ntry'], ntry
+    ...         ntry += 1
+    ...         dm['ntry'] = ntry
+    ...         if ntry % 3:
+    ...             raise ZODB.POSException.ConflictError()
+    0 0
+    0 1
+    0 2
+    """
+
 class InvalidationTests(unittest.TestCase):
 
     # It's harder to write serious tests, because some of the critical



More information about the Zodb-checkins mailing list