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

时间:2013-08-30 00:04:53

标签: django

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

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

1 个答案:

答案 0 :(得分:2)

没有。您提供的示例将进行2次查询:

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

显然只有第一把锁。但是,如果使用select_related(),则单个查询将为:

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中,但它可能依赖于db)。