my_model_instance = MyModel.objects.select_for_update().get(id=1)
something_related = my_model_instance.related_thing
在上面的代码中,是通过外键related_thing
关联的另一个模型实例。my_model_instance
既然我最初做了 a select_for_update()
,也会related_thing
被锁定吗?
my_model_instance = MyModel.objects.select_for_update().get(id=1)
something_related = my_model_instance.related_thing
在上面的代码中,是通过外键related_thing
关联的另一个模型实例。my_model_instance
既然我最初做了 a select_for_update()
,也会related_thing
被锁定吗?
不,您给出的示例将进行 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中,但它可能依赖于数据库)。