Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#15317 closed (invalid)

TransactionManagementError exception on a clean transaction

Reported by: jbl1 Owned by: nobody
Component: Database layer (models, ORM) Version: master
Severity: Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:

Description

I have a simple test view decorated with a transaction.commit_manually. The view does only a few database (MySQL) reads. Before returning I do a transaction.commit() and surely the call to transaction.is_dirty() returns False.

A further test with all database reads removed yields the same result.

My Django installation is at SVN 15540.

Change History (2)

comment:1 follow-up: Changed 4 years ago by russellm

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Resolution set to invalid
  • Status changed from new to closed

Sounds like you've been tripped up by r15493. However, since you haven't provided any details that would allow us to reproduce your problem, I can't confirm or deny this.

If you are reporting a problem, you need to provide enough detail for someone else to reproduce the problem *exactly*. It's no good giving vague descriptions -- we need specific code samples, or at the very least, precise instructions that will allow someone else to reproduce the problem you are seeing.

Closing invalid. Please reopen if you can provide the necessary detail.

comment:2 in reply to: ↑ 1 Changed 4 years ago by jbl1

Replying to russellm:

Sounds like you've been tripped up by r15493. However, since you haven't provided any details that would allow us to reproduce your problem, I can't confirm or deny this.

If you are reporting a problem, you need to provide enough detail for someone else to reproduce the problem *exactly*. It's no good giving vague descriptions -- we need specific code samples, or at the very least, precise instructions that will allow someone else to reproduce the problem you are seeing.

Closing invalid. Please reopen if you can provide the necessary detail.

Indeed, I was quite vague. My test view was:

@transaction.commit_manually
def test(request):
    return render_to_response("bdo/test.html", RequestContext(request))

and it failed in my environment with the TransactionManagementError exception. When trying to further minimize the example for the purpose of reopening this ticket, I removed the call to RequestContext like so:

@transaction.commit_manually
def test(request): 
    return render_to_response("bdo/test.html")

and then the view passed.
It turned out that I have a custom context processor which accesses the database to determine the menu functions available to the logged on user thus dirtying the transaction. I now do a conditional transaction.commit() in the context processor:

def create_menu(request):
   # ...
   # a database read
   if transaction.is_managed() :
      transaction.commit()
   # ...

which seems to solve the problem.

So it turns out that the ticket as stated is indeed invalid. Nonetheless, to prevent others tripping over in similar circumstances it might be helpful to amend at least the 1.3 release notes (http://docs.djangoproject.com/en/dev/releases/1.3/#transaction-management) and perhaps also the Managing database transactions section of the documentation (http://docs.djangoproject.com/en/dev/topics/db/transactions/). Sorry for not providing a sample wording...

There is one more candidate case to be mentioned in the docs: database accesses from within a template. If the corresponding view is transaction.commit_manually decorated then TemplateResponse and a post-render callback with transaction commit or rollback in it seem to come handy.

Last edited 4 years ago by jbl1 (previous) (diff)
Note: See TracTickets for help on using tickets.
Back to Top