Thursday, August 11, 2011

decorator and context manager for nested transaction source code

Hello,

I'm using Django since a couple of years and the more I use it the
more I wish a support for django-managed nested transactions.
In complex programs happens often to need them.

So I would post here my own code of such tool, based of Django 1.3
commit_on_success().
Please help understand if it's correct or not ;)

BEWARE: currently I used it only in simple tests !! Do not use in
production !

Hints, suggestions, critiques are most welcome !

Many thanks

Ale


from django.db.transaction import is_managed,managed,
enter_transaction_management, is_dirty, rollback, commit,
leave_transaction_management,_transaction_func
import threading

_tl = threading.local()

def nested_commit_on_success(using=None):

def entering(using):
lev = getattr(_tl,"level",0)
lev += 1
setattr(_tl,"level",lev)
if lev >= 2: #is_managed():
print "IN-NESTED"
else:
print "IN-NORMAL"
enter_transaction_management(using=using)
managed(True, using=using)

def exiting(exc_value, using):
lev = getattr(_tl,"level")
oldlev = lev
lev -= 1
setattr(_tl,"level",lev)
if oldlev >= 2:
print "OUT-NESTED"
return
print "OUT-NORMAL"
try:
if exc_value is not None:
if is_dirty(using=using):
rollback(using=using)
else:
if is_dirty(using=using):
try:
commit(using=using)
except:
rollback(using=using)
raise
finally:
leave_transaction_management(using=using)

return _transaction_func(entering, exiting, using)

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

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home


Real Estate