[Checkins] SVN: z3c.zalchemy/trunk/ Added support for savepoints.
Christian Theune
ct at gocept.com
Fri Jan 11 10:46:06 EST 2008
Log message for revision 82813:
Added support for savepoints.
Changed:
U z3c.zalchemy/trunk/CHANGES.txt
U z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt
U z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py
U z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt
-=-
Modified: z3c.zalchemy/trunk/CHANGES.txt
===================================================================
--- z3c.zalchemy/trunk/CHANGES.txt 2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/CHANGES.txt 2008-01-11 15:46:05 UTC (rev 82813)
@@ -8,6 +8,8 @@
- Updated to SQLAlchmy 0.4 compatibility. `z3c.zalchemy` now requires
SQLAlchemy 0.4
+ - Added support for non-optimistic savepoints. Rolling back savepoints does
+ not evict the session but roll back the loaded object's state.
0.2.1 - 2007-11-13
==================
Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt 2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/container.txt 2008-01-11 15:46:05 UTC (rev 82813)
@@ -93,7 +93,7 @@
>>> [key for key in c.keys()]
['SQLTestMulti-1-a']
>>> c["SQLTestMulti-1-a"].id2
- 'a'
+ u'a'
NameChooser
===========
Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py 2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/datamanager.py 2008-01-11 15:46:05 UTC (rev 82813)
@@ -230,7 +230,8 @@
def savepoint(self):
self._flush_session()
- return AlchemySavepoint()
+ transaction = self.session.begin_nested()
+ return AlchemySavepoint(transaction, self.session)
def _cleanup(self):
Session.remove()
@@ -253,8 +254,16 @@
implements(IDataManagerSavepoint)
+ def __init__(self, transaction, session):
+ self.transaction = transaction
+ self.session = session
+
def rollback(self):
- raise Exception("Can't roll back zalchemy savepoints.")
+ # Savepoints expire the objects so they get reloaded with the old
+ # state
+ self.transaction.rollback()
+ for obj in self.session:
+ self.session.expire(obj)
class MetaManager(object):
Modified: z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt
===================================================================
--- z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt 2008-01-11 14:50:23 UTC (rev 82812)
+++ z3c.zalchemy/trunk/src/z3c/zalchemy/tests/TRANSACTION.txt 2008-01-11 15:46:05 UTC (rev 82813)
@@ -147,12 +147,35 @@
3
>>> transaction.abort()
+Note that objects are cleared from the session when doing an abort. We need to
+get the object from the session again to see the updated state:
+
+ >>> a.value
+ 3
>>> session = z3c.zalchemy.getSession()
>>> a = session.get(A, 1)
>>> a.value
2
+Save points
+-----------
+Save points can be used for partial rollbacks without the need to get objects
+from the session again, as they are only expired. This requires that you need
+to be careful passing out objects that you created during after your savepoint
+and before rolling back:
+
+ >>> a.value
+ 2
+ >>> sp = transaction.savepoint()
+ >>> a.value += 1
+ >>> a.value
+ 3
+
+ >>> sp.rollback()
+ >>> a.value
+ 2
+
Two Phase Commit With Errors
----------------------------
More information about the Checkins
mailing list