2
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被锁定吗?

4

1 回答 1

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

于 2013-09-12T19:11:45.973 回答