gpt4 book ai didi

django - 在没有竞争条件的情况下在 Django 中进行有条件更新

转载 作者:行者123 更新时间:2023-12-04 00:39:51 24 4
gpt4 key购买 nike

如何根据当前值更新模型字段并避免竞争条件?更新任务可以写成:

if (self.x == y):
self.x = z
self.save()
else:
raise Exception()

但是,存在竞争条件。我想出了以下解决方案:
from django.db import transaction
with transaction.atomic():
if (self.x == y):
self.x = z
self.save()
else:
raise Exception()

但这安全吗,还有更好的方法吗?

最佳答案

不,那个atomic()块不会做任何事情,因为您已经从数据库中获取了值并放入 self在您尝试运行事务之前。

如果您可以在查询参数中表达您的条件,则可以使用 update() 在单个查询中安全地执行此操作:

num_matched = MyModel.objects.filter(id=self.id, x=y).update(x=z)
if num_matched != 1:
raise Exception()

如果没有,您可以使用 select_for_update() :
with transaction.atomic():
current = MyModel.objects.select_for_update().get(id=self.id)
if (current.x == y):
current.x = z
current.save()
else:
raise Exception()

这与上面的代码之间的区别在于,在进行比较之前,您在此处明确告诉数据库要锁定哪一行。

关于django - 在没有竞争条件的情况下在 Django 中进行有条件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33203590/

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