Skip to content

Commit

Permalink
[1.7.x] Fixed #22491 -- documented how select_for_update() should be …
Browse files Browse the repository at this point in the history
…tested.

Thanks Andreas Pelme for the report.

Backport of 668d432 from master
  • Loading branch information
mmardini authored and timgraham committed Jul 28, 2014
1 parent 2077bbe commit acbe3fa
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
23 changes: 17 additions & 6 deletions docs/ref/models/querysets.txt
Expand Up @@ -1421,24 +1421,35 @@ backends support ``select_for_update()``. However, MySQL has no support for the
``nowait`` argument. Obviously, users of external third-party backends should ``nowait`` argument. Obviously, users of external third-party backends should
check with their backend's documentation for specifics in those cases. check with their backend's documentation for specifics in those cases.


Passing ``nowait=True`` to ``select_for_update`` using database backends that Passing ``nowait=True`` to ``select_for_update()`` using database backends that
do not support ``nowait``, such as MySQL, will cause a do not support ``nowait``, such as MySQL, will cause a
:exc:`~django.db.DatabaseError` to be raised. This is in order to prevent code :exc:`~django.db.DatabaseError` to be raised. This is in order to prevent code
unexpectedly blocking. unexpectedly blocking.


Evaluating a queryset with ``select_for_update`` in autocommit mode is Evaluating a queryset with ``select_for_update()`` in autocommit mode is
an error because the rows are then not locked. If allowed, this would a :exc:`~django.db.transaction.TransactionManagementError` error because the
facilitate data corruption, and could easily be caused by calling, rows are not locked in that case. If allowed, this would facilitate data
outside of any transaction, code that expects to be run in one. corruption and could easily be caused by calling code that expects to be run in
a transaction outside of one.


Using ``select_for_update`` on backends which do not support Using ``select_for_update()`` on backends which do not support
``SELECT ... FOR UPDATE`` (such as SQLite) will have no effect. ``SELECT ... FOR UPDATE`` (such as SQLite) will have no effect.


.. versionchanged:: 1.6.3 .. versionchanged:: 1.6.3


It is now an error to execute a query with ``select_for_update()`` in 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. autocommit mode. With earlier releases in the 1.6 series it was a no-op.


.. warning::

Although ``select_for_update()`` normally fails in autocommit mode, since
:class:`~django.test.TestCase` automatically wraps each test in a
transaction, calling ``select_for_update()`` in a ``TestCase`` even outside
an :func:`~django.db.transaction.atomic()` block will (perhaps unexpectedly)
pass without raising a ``TransactionManagementError``. To properly test
``select_for_update()`` you should use
:class:`~django.test.TransactionTestCase`.

raw raw
~~~ ~~~


Expand Down
5 changes: 4 additions & 1 deletion docs/topics/testing/tools.txt
Expand Up @@ -622,7 +622,10 @@ to test the effects of commit and rollback:
While ``commit`` and ``rollback`` operations still *appear* to work when While ``commit`` and ``rollback`` operations still *appear* to work when
used in ``TestCase``, no actual commit or rollback will be performed by the used in ``TestCase``, no actual commit or rollback will be performed by the
database. This can cause your tests to pass or fail unexpectedly. Always database. This can cause your tests to pass or fail unexpectedly. Always
use ``TransactionTestCase`` when testing transactional behavior. use ``TransactionTestCase`` when testing transactional behavior or any code
that can't normally be excuted in autocommit mode
(:meth:`~django.db.models.query.QuerySet.select_for_update()` is an
example).


``TransactionTestCase`` inherits from :class:`~django.test.SimpleTestCase`. ``TransactionTestCase`` inherits from :class:`~django.test.SimpleTestCase`.


Expand Down

0 comments on commit acbe3fa

Please sign in to comment.