#15383: TransactionManagementError although I've rollbacked the transaction
------------------------------------------+---------------------------------
 Reporter:  coopkont@…                    |          Owner:  nobody    
   Status:  new                           |      Milestone:  1.3       
Component:  Database layer (models, ORM)  |        Version:  SVN       
 Keywords:  transaction                   |   Triage Stage:  Unreviewed
Has patch:  0                             |  
------------------------------------------+---------------------------------
 Hi,

 This bug must be very recent, as my piece of code that is now blowing used
 to work.
 The problem is when a function has the @transaction.commit_manually and it
 calls another function after it rolls back.

 Example

 @transaction.commit_manually
 def example(request):
     transaction.rollback()
     another_func()

 If the proc returns an HttpResponse or a redirect or whatever after the
 rollback this works fine. Trying to debug the django code I've realized
 that the transaction rollbacks fine and the connection is set to
 _dirty=False. But as soon as another function is called the connection is
 flagged to dirty again. Now even if the function called does not have the
 decorator the connection will be set to dirty.

 Not sure at all if the expected behavior is to set the connection to dirty
 but it looks to me like it's causing this issue since the following code
 checks that variable and just throws an error:

  def leave_transaction_management(self):
         """
         Leaves transaction management for a running thread. A dirty flag
 is carried
         over to the surrounding block, as a commit will commit all
 changes, even
         those from outside. (Commits are on connection level.)
         """
         self._leave_transaction_management(self.is_managed())
         if self.transaction_state:
             del self.transaction_state[-1]
         else:
             raise TransactionManagementError("This code isn't under
 transaction "
                 "management")
         if self._dirty:
             self.rollback()
             raise TransactionManagementError("Transaction managed block
 ended with "
                 "pending COMMIT/ROLLBACK")
         self._dirty = False

 This is on the trunk version 1.3 beta 1 SVN-15632

 This is my stack trace:

 Unexpected error in request /register/ : Traceback (most recent call
 last):
   File "/usr/lib/python2.6/dist-packages/django/core/handlers/base.py",
 line 111, in get_response
     response = callback(request, *callback_args, **callback_kwargs)
   File "/usr/lib/python2.6/dist-packages/django/db/transaction.py", line
 223, in inner
     self.__exit__(None, None, None)
   File "/usr/lib/python2.6/dist-packages/django/db/transaction.py", line
 208, in __exit__
     self.exiting(exc_value, self.using)
   File "/usr/lib/python2.6/dist-packages/django/db/transaction.py", line
 303, in exiting
     leave_transaction_management(using=using)
   File "/usr/lib/python2.6/dist-packages/django/db/transaction.py", line
 56, in leave_transaction_management
     connection.leave_transaction_management()
   File "/usr/lib/python2.6/dist-packages/django/db/backends/__init__.py",
 line 115, in leave_transaction_management
     raise TransactionManagementError("Transaction managed block ended with
 "
 TransactionManagementError: Transaction managed block ended with pending
 COMMIT/ROLLBACK

-- 
Ticket URL: <http://code.djangoproject.com/ticket/15383>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

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

Reply via email to