django - 在 Django 中,如果我 select_for_update() 一个特定的模型实例,它的相关模型实例也会被锁定吗?

标签 django

my_model_instance = MyModel.objects.select_for_update().get(id=1)
something_related = my_model_instance.related_thing

在上面的代码中,lated_thing 是通过外键与 my_model_instance 相关的另一个模型实例。由于我最初执行了 select_for_update()lated_thing 也会被锁定吗?

最佳答案

没有。您给出的示例将进行 2 个查询:

SELECT ••• FROM `mymodel` WHERE `mymodel`.`id` = 1 FOR UPDATE;
SELECT ••• FROM `related_thing` WHERE `related_thing`.`id` = ?;

显然只有第一个锁。但是,如果您使用 select_lated(),单个查询将是:

SELECT ••• FROM `mymodel` LEFT OUTER JOIN `related_thing` ON (`mymodel`.`related_thing_id` = `related_thing`.`id`) WHERE `mymodel`.`id` = 1 FOR UPDATE;

在这种情况下,它也会锁定 related_thing (至少在 MySQL 中,但它可能依赖于数据库)。

关于django - 在 Django 中,如果我 select_for_update() 一个特定的模型实例,它的相关模型实例也会被锁定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18522883/

相关文章:

python - Django,无反向匹配

python - Django DateTimeInput 类型 'datetime-local' 未保存到数据库

Python PIL 在渲染文本时添加额外的字符

python - 比较表中的字段和 django-orm 中的计算字段

python - Django Forms - 保存后重定向

python - 无法加载 Bootstrap css 文件

python - 属性错误 : 'Settings' object has no attribute 'MERCHANT_SETTINGS'

python - django 会在接下来的 ~5~ 年内存在吗?

python - 计算两个字段的总和以过滤条目

Django clean 方法在 POST 上抛出 KeyError