gpt4 book ai didi

python - Django 对象锁定

转载 作者:行者123 更新时间:2023-11-28 19:09:27 24 4
gpt4 key购买 nike

我正在使用 Django 1.8 并且我有一个模型

class ModelA(models.Model):
some_field = models.PositiveIntegerField()

现在,在我看来,我想添加一个新的 ModelA 对象,但前提是该值的条目已经少于 x 个。

def my_view(request):
# Using the value of 4 here just as an example
c = ModelA.objects.filter(some_field=4).count()
# Check if fewer than (x=20) objects with this field already
if c < 20:
# Fewer, so create one
new_model = ModelA(4)
new_model.save()
else:
# Return a message saying "too many"

根据我的理解,可能有多个线程在运行此方法,因此线程 1 可能会执行计数并且少于 20,然后另一个线程保存一个新对象,然后线程 1 将保存其对象并有20 或更多。

有什么方法可以让 View 成为

def my_view(request):
get_a_lock_on_model(ModelA)
c = ModelA.objects....
# Rest of the code the same
release_lock_on_model(ModelA)

或者我应该考虑采用其他方式吗?只有插入,从不更新或删除。

谢谢!

最佳答案

为此,您需要锁定整个表,如何锁定取决于您使用的 RDBMS。会涉及到raw sql的使用。另一种方法是在保存记录后进行计数

def my_view(request):
new_model = ModelA(4)
new_model.save()

try :
c = ModelA.objects.filter(some_field=4)[20]
if c.pk == new_model.pk:
c.delete()
# Return a message saying "too many"

except IndexError:
pass

这种方法不会互相干扰,每个线程负责删除它添加的额外项目。如果计数大于 20,则可以使用 atomic 和 rollback 而不是删除

关于python - Django 对象锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42243816/

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