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。
您的事务获取并持有锁。
当您尝试再次获取它时,没有任何反应,因为您的事务已经锁定了该行。
我有一些代码如果嵌套调用 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。
您的事务获取并持有锁。
当您尝试再次获取它时,没有任何反应,因为您的事务已经锁定了该行。