Почему выбор для обновления не работает в Django MySQL? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть таблица, как показано ниже

select id, name from node;
+----+------+
| id | name |
+----+------+
|  5 | na   |
+----+------+

Затем определите функцию ниже

>>> def foo_with_sfu(seconds):
...     with transaction.atomic():
...         node = Node.objects.select_for_update().filter(pk=5)[0]
...         print(node.name)
...         time.sleep(seconds)
...         node = Node.objects.get(pk=5)
...         print(node.name)
... 

Я надеялся, что select_for_update заблокирует строку pk = 5, поэтому, если я открою другую консоль для измененияимя узла во время time.sleep, операция изменения будет заблокирована, и две печати вышеупомянутой функции всегда будут возвращать согласованный результат.

Но на самом деле, когда я запускаю функцию и запускаю update sql в другой консоливо время time.sleep обновление не было заблокировано.

Кажется, что выбор для обновления не блокирует строку.Почему?

1 Ответ

0 голосов
/ 28 сентября 2018

Ваш запрос select_for_update() никогда не обрабатывается, поэтому блокировка никогда не выполняется в базе данных.См. документацию о том, когда и как оцениваются наборы запросов.

Если вы просто заключите вызов в функцию оценки наборов запросов, ваш тест должен работать.Например:

with transaction.atomic():
    node = list(Node.objects.select_for_update().filter(pk=5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...