mysql - 为什么 "select_for_update()"不能在 Django 和 MySQL 中一起工作?

标签 mysql django transactions select-for-update

我有一个如下表:

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)
...         time.sleep(seconds)
...         node = Node.objects.get(pk=5)
...         print(node.name)
... 

我希望 select_for_update 会锁定行 pk=5,因此如果我在 time.sleep 期间打开另一个控制台来更改 node.name,则更改操作将被阻止。

但实际上,当我运行该函数,并在 time.sleep 期间在另一个控制台中运行 update sql 时,更新并未被阻止。

更新的选择似乎没有锁定该行。为什么?

最佳答案

您的 select_for_update() 查询永远不会被评估,因此锁永远不会在数据库上执行。请参阅the documentation了解何时以及如何评估查询集。

如果您只是将调用包装在查询集评估函数中,您的测试应该可以工作。例如:

with transaction.atomic():
    node = list(Node.objects.select_for_update().filter(pk=5))

关于mysql - 为什么 "select_for_update()"不能在 Django 和 MySQL 中一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52547672/

相关文章:

php - 如何在 3 个实体(项目、它们的类别和附加字段)之间创建数据库关系?

MySQL - 将日期列转换为时间戳

django - 自定义用户模型和南

python - Strato 网站空间上的 Django

spring - 事务可重复读取隔离在 PostgreSQL 中无法正常工作

mysql - 其中子句 : Compact byte storage day of week

php - 显示数组中的数据时出现非法字符串偏移

django - 在 Django 后端使用 Angular JS 路由的最佳实践方法是什么?

java - JPA PessimisticLockScope.NORMAL 和锁定 "relationships"

PHP 和 MySQL : Running transactions yourself?