Yes it actually works if I use session.flush() instead of transaction.commit() within the subtransaction. So I guess transaction.commit() and transaction.abort() close the entire transaction unlike session.commit() which when matched against session.begin_nested() releases the savepoint but keeps outer transaction intact. Obviously I failed to try all combinations before when using savepoint to rollback would raise an error (because the transaction was finalized with transaction.commit()).

Now looking back at all these tests performed and various combinations, it does all make sense and it was my wrong understanding that I could use savepoints as "real" subtransactions, ie. commit (to disc) everything between savepoint and its commit regardless of the "outer" transaction, although the other way around works: outer transaction can be committed if "inner" rolled back.

I still don't know how I can manually release the savepoint using Transaction, or even if that is necessary at all? Does releasing savepoint_1 "return" its code back to the "outer" transaction, so that savepoint_2's failure would not rollback even savepoint_1?


So basically this entire issue was caused by my lack of experience with savepoints and total misunderstanding of how the Transaction package works as opposed to using SQLA's session directly.


.oO V Oo.


On 11/16/2011 09:38 AM, Chris McDonough wrote:
On Tue, 2011-11-15 at 11:44 -0600, Michael Merickel wrote:
It's been hard to follow what has actually been tried, but I just
wanted to point some stuff out about zope.sqlalchemy (the code for it
is literally 1 small file and shouldn't be talked about with such a
scary tone).


When doing transaction.savepoint() it returns a savepoint object that
calls "session.begin_nested()". and when you call rollback on that
savepoint object it calls "session.rollback()". I think that is
identical to SQLAlchemy's expected use. For example:


sp = transaction.savepoint() # session.begin_nested()
try:
     # do stuff
except IntegrityError:
     sp.rollback() # session.rollback()


# do more stuff
transaction.commit() # or ideally don't commit and let pyramid_tm do
that part for you
Vlad: it'd be useful to know whether this (savepoint.rollback()) doesn't
work for you (as opposed to using session.rollback()).

- C

--
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To post to this group, send email to pylons-discuss@googlegroups.com.
To unsubscribe from this group, send email to 
pylons-discuss+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/pylons-discuss?hl=en.

Reply via email to