I am a bit unclear about the way i should handle transactions inside a particular situation.
I have got a bit of code that boils lower for this:
from django.db import transaction @transaction.commit_on_success def process_post(): #do stuff with database for reply in post_replies: process_post_reply(reply) @transaction.commit_on_success def process_post_reply(reply): #do stuff with database
I wish to understand what happens if your
So how exactly does commit_on_success handle being nested? Does it understand to commit each
process_post_reply() or maybe one fails the entire
process_post() comes back?
Here's the origin code from it: http://code.djangoproject.com/browser/django/tags/releases/1.2.4/django/db/transaction.py#L286
And enter_transaction_management is actually putting new transaction handling mode on thread stack.
So, inside your situation, if process_publish_reply() fails (i.e. exception happens), then transaction is folded in its whole, and so the exception advances upwards from process_publish() too but there's absolutely nothing to rollback.
With no, if a person process_publish_reply() fails then whole process_publish() isn't being folded back - there is no miracle there, only COMMIT and ROLLBACK on database level, meaning what's get folded back is just what's been writted to DB after last commited process_publish_reply().
Outlining, I believe that the thing you need is simply a single commit_on_success() around process_publish, possibly based on transaction savepoints - which regrettably can be found only in PostgreSQL after sales, despite the fact that MySQL 5.x supports them also.