From a5b4a909f09955d164c3462ae32a45aa1fdd6f2d Mon Sep 17 00:00:00 2001 From: kola-er Date: Mon, 4 Nov 2019 22:44:10 +0100 Subject: [PATCH] [3.0.x] Fixed #30928 -- Clarified MySQL/MariaDB support of QuerySet.select_for_update() options. Thanks Par Andersson for reporting the issue. Backport of d94d7b113c21d7a0fd802fadb1adbbec8155e880 from master --- docs/ref/databases.txt | 15 +++++++++++---- docs/ref/models/querysets.txt | 5 +++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index 4256395d781..fcc6596b82d 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -625,10 +625,17 @@ both MySQL and Django will attempt to convert the values from UTC to local time. Row locking with ``QuerySet.select_for_update()`` ------------------------------------------------- -MySQL does not support the ``NOWAIT``, ``SKIP LOCKED``, and ``OF`` options to -the ``SELECT ... FOR UPDATE`` statement. If ``select_for_update()`` is used -with ``nowait=True``, ``skip_locked=True``, or ``of`` then a -:exc:`~django.db.NotSupportedError` is raised. +MySQL and MariaDB do not support some options to the ``SELECT ... FOR UPDATE`` +statement. If ``select_for_update()`` is used with an unsupported option, then +a :exc:`~django.db.NotSupportedError` is raised. + +=============== ========= ========== +Option MariaDB MySQL +=============== ========= ========== +``SKIP LOCKED`` X (≥8.0.1) +``NOWAIT`` X (≥10.3) X (≥8.0.1) +``OF`` +=============== ========= ========== When using ``select_for_update()`` on MySQL, make sure you filter a queryset against at least set of fields contained in unique constraints or only against diff --git a/docs/ref/models/querysets.txt b/docs/ref/models/querysets.txt index 17238a56f6d..4e12ecabe36 100644 --- a/docs/ref/models/querysets.txt +++ b/docs/ref/models/querysets.txt @@ -1706,8 +1706,9 @@ them:: , ...]> Currently, the ``postgresql``, ``oracle``, and ``mysql`` database -backends support ``select_for_update()``. However, MySQL doesn't support the -``nowait``, ``skip_locked``, and ``of`` arguments. +backends support ``select_for_update()``. However, MariaDB 10.3+ supports only +the ``nowait`` argument and MySQL 8.0.1+ supports the ``nowait`` and +``skip_locked`` arguments. MySQL and MariaDB don't support the ``of`` argument. Passing ``nowait=True``, ``skip_locked=True``, or ``of`` to ``select_for_update()`` using database backends that do not support these