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
也会被锁定吗?
答案 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)。