mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #9964 -- Ensure that all database operations make transactions dirty, not just write operations. Many thanks to Shai Berger for his work and persistence on this issue.
This is BACKWARDS INCOMPATIBLE for anyone relying on the current behavior that allows manually managed read-only transactions to be left dangling without a manual commit or rollback. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15493 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
d1cd53d9cf
commit
6314a1b42e
11 changed files with 271 additions and 47 deletions
|
@ -233,37 +233,17 @@ alias::
|
|||
|
||||
Transactions and raw SQL
|
||||
------------------------
|
||||
If you are using transaction decorators (such as ``commit_on_success``) to
|
||||
wrap your views and provide transaction control, you don't have to make a
|
||||
manual call to ``transaction.commit_unless_managed()`` -- you can manually
|
||||
commit if you want to, but you aren't required to, since the decorator will
|
||||
commit for you. However, if you don't manually commit your changes, you will
|
||||
need to manually mark the transaction as dirty, using
|
||||
``transaction.set_dirty()``::
|
||||
|
||||
@commit_on_success
|
||||
def my_custom_sql_view(request, value):
|
||||
from django.db import connection, transaction
|
||||
cursor = connection.cursor()
|
||||
When you make a raw SQL call, Django will automatically mark the
|
||||
current transaction as dirty. You must then ensure that the
|
||||
transaction containing those calls is closed correctly. See :ref:`the
|
||||
notes on the requirements of Django's transaction handling
|
||||
<topics-db-transactions-requirements>` for more details.
|
||||
|
||||
# Data modifying operation
|
||||
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [value])
|
||||
.. versionchanged:: 1.3
|
||||
|
||||
# Since we modified data, mark the transaction as dirty
|
||||
transaction.set_dirty()
|
||||
|
||||
# Data retrieval operation. This doesn't dirty the transaction,
|
||||
# so no call to set_dirty() is required.
|
||||
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [value])
|
||||
row = cursor.fetchone()
|
||||
|
||||
return render_to_response('template.html', {'row': row})
|
||||
|
||||
The call to ``set_dirty()`` is made automatically when you use the Django ORM
|
||||
to make data modifying database calls. However, when you use raw SQL, Django
|
||||
has no way of knowing if your SQL modifies data or not. The manual call to
|
||||
``set_dirty()`` ensures that Django knows that there are modifications that
|
||||
must be committed.
|
||||
Prior to Django 1.3, it was necessary to manually mark a transaction
|
||||
as dirty using ``transaction.set_dirty()`` when using raw SQL calls.
|
||||
|
||||
Connections and cursors
|
||||
-----------------------
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue