Django 的 select_for_update 在同一条记录上使用两次时会死锁吗?

Can Django's select_for_update deadlock when used on the same record twice?

我有一些代码如果嵌套调用 select_for_update() 会简单很多,但恐怕我自己陷入了僵局。

示例:

with transaction.atomic():
    uu1 = UniUser.objects.select_for_update().get(pk=uupk)
    with transaction.atomic():
        uu2 = UniUser.objects.select_for_update().get(pk=uupk)  # why no deadlock here??
        uu2.bio = 'i like pizza'
        uu2.save()
    uu1.bio = 'i like pie'
    uu1.save()

我原以为第二个 select_for_update() 会死锁,因为它试图锁定一个已经锁定的记录,但这段代码运行得很好,我们最终在 bio 中得到了 'i like pie'。如果我删除内部事务并在同一事务中两次锁定同一记录,则同上。

这里为什么没有死锁?这是安全密码吗?

如果答案是特定于数据库的,我正在使用 Postgres。

您的事务获取并持有锁。

当您尝试再次获取它时,没有任何反应,因为您的事务已经锁定了该行。