diff options
| author | Shai Berger <shai@platonix.com> | 2014-03-30 20:03:35 +0300 |
|---|---|---|
| committer | Shai Berger <shai@platonix.com> | 2014-04-10 02:15:14 +0300 |
| commit | 690a5984a3c0a706b8cc296bdcccd524b2079559 (patch) | |
| tree | 09293d29771b03a44e0b00abc47e840e6f508982 /docs | |
| parent | 6fa7d7c594597ab7072ffa740da5b6f4a5a6cd26 (diff) | |
[1.6.x] Fixed #22343 -- Disallowed select_for_update in autocommit mode
The ticket was originally about two failing tests, which are
fixed by putting their queries in transactions.
Thanks Tim Graham for the report, Aymeric Augustin for the fix,
and Simon Charette, Tim Graham & Loïc Bistuer for review.
Backport of b990df1d63 from master
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/ref/models/querysets.txt | 10 | ||||
| -rw-r--r-- | docs/releases/1.6.3.txt | 28 | ||||
| -rw-r--r-- | docs/topics/db/transactions.txt | 5 |
3 files changed, 41 insertions, 2 deletions
diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt index 69e15dc0e9..14e2cfac18 100644 --- a/docs/ref/models/querysets.txt +++ b/docs/ref/models/querysets.txt @@ -1314,9 +1314,19 @@ do not support ``nowait``, such as MySQL, will cause a :exc:`~django.db.DatabaseError` to be raised. This is in order to prevent code unexpectedly blocking. +Executing a queryset with ``select_for_update`` in autocommit mode is +an error because the rows are then not locked. If allowed, this would +facilitate data corruption, and could easily be caused by calling, +outside of any transaction, code that expects to be run in one. + Using ``select_for_update`` on backends which do not support ``SELECT ... FOR UPDATE`` (such as SQLite) will have no effect. +.. versionchanged:: 1.6.3 + + It is now an error to execute a query with ``select_for_update()`` in + autocommit mode. With earlier releases in the 1.6 series it was a no-op. + Methods that do not return QuerySets ------------------------------------ diff --git a/docs/releases/1.6.3.txt b/docs/releases/1.6.3.txt index ca9069d250..c6981fa96b 100644 --- a/docs/releases/1.6.3.txt +++ b/docs/releases/1.6.3.txt @@ -5,7 +5,33 @@ Django 1.6.3 release notes *Under development* This is Django 1.6.3, a bugfix release for Django 1.6. Django 1.6.3 fixes -several bugs in 1.6.2: +several bugs in 1.6.2 and makes one backwards-incompatible change: + +``select_for_update()`` requires a transaction +============================================== + +Historically, queries that use +:meth:`~django.db.models.query.QuerySet.select_for_update()` could be +executed in autocommit mode, outside of a transaction. Before Django +1.6, Django's automatic transactions mode allowed this to be used to +lock records until the next write operation. Django 1.6 introduced +database-level autocommit; since then, execution in such a context +voids the effect of ``select_for_update()``. It is, therefore, assumed +now to be an error, and raises an exception. + +This change may cause test failures if you use ``select_for_update()`` +in a test class which is a subclass of +:class:`~django.test.TransactionTestCase` rather than +:class:`~django.test.TestCase`. + +This change was made because such errors can be caused by including an +app which expects global transactions (e.g. :setting:`ATOMIC_REQUESTS +<DATABASE-ATOMIC_REQUESTS>` set to True), or Django's old autocommit +behavior, in a project which runs without them; and further, such +errors may manifest as data-corruption bugs. + +Other bugfixes and changes +========================== * Content retrieved from the GeoIP library is now properly decoded from its default ``iso-8859-1`` encoding diff --git a/docs/topics/db/transactions.txt b/docs/topics/db/transactions.txt index 427bef32f2..13cfbcf1bb 100644 --- a/docs/topics/db/transactions.txt +++ b/docs/topics/db/transactions.txt @@ -722,7 +722,10 @@ Select for update If you were relying on "automatic transactions" to provide locking between :meth:`~django.db.models.query.QuerySet.select_for_update` and a subsequent write operation — an extremely fragile design, but nonetheless possible — you -must wrap the relevant code in :func:`atomic`. +must wrap the relevant code in :func:`atomic`. Since Django 1.6.3, executing +a query with :meth:`~django.db.models.query.QuerySet.select_for_update` in +autocommit mode will raise a +:exc:`~django.db.transaction.TransactionManagementError`. Using a high isolation level ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
