gpt4 book ai didi

带有 transaction.atomic 的 Django "Deadlock found"

转载 作者:行者123 更新时间:2023-12-05 07:34:18 24 4
gpt4 key购买 nike

我有一个函数可以更新模型或创建一个新条目(如果它尚不存在):

try:            
obj=model.objects.get(id=id)
setattr(obj, 'completed', True)
obj.save()
except:
model.objects.create(id=x, user=y, completed=True)

在特定情况下,此函数被调用两次的速度如此之快,以至于它在数据库中创建了两个条目,因此,我包含了一个唯一约束以确保它永远不会发生。

但后来我开始收到这个错误:

Duplicate entry '1-13' for key 'x_y_z_uniq'

所以我尝试像这样使用锁:

with transaction.atomic():
try:
obj=model.objects.select_for_update().get(id=id)
setattr(obj, 'completed', True)
obj.save()
except:
model.objects.create(id=x, user=y, completed=True)

但是现在出现这个错误:

(Deadlock found when trying to get lock; try restarting transaction)

我想要一种方法,该函数的第一次调用将创建一个新条目,第二次调用将更新该条目,但是第二次调用由于死锁而失败,我怎样才能让它等待第二次调用第一个完成的?

最佳答案

在我看来你可以在这里使用简单的 .update() 方法:
obj=model.objects.filter(id=id).update(completed=True)

更重要的是,您可以将所有代码重构为 this :

obj, created = model.objects.update_or_create(
id=id,
defaults={'id': x, 'user': y, 'completed': True}
)

关于带有 transaction.atomic 的 Django "Deadlock found",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50221300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com