我有一个Django网络应用程序,可以为竞争对手注册活动。当有人注册参加活动时,他们会登录并填写注册表,然后在视图中查看表单,保存(commit = False)并从竞争对手的现有实例获得最高竞争者编号,并为此新竞争对手I将数字设置为最高+ 1,然后我在
上执行save()在模型上,我在事件和数字的'竞争者'模型上有一个独特的,这确保了数字在事件中是唯一的。
现在,对于大型匹配,我遇到一个问题,当许多同时注册,因为它们最终在save(commit = false) - set number - save()同时,并尝试save()同时number - 这会引发IntegrityError,重复键,因为我尝试使用与此间隔期间创建的实例相同的事件和数字来保存新实例。
: - (
现在,有关如何避免此问题的任何想法或逻辑?
/ Jens
答案 0 :(得分:0)
以下是关于如何做到这一点的想法(灵感来自Handling race condition in model.save());
while True:
try:
competitor.save(commit=False)
# do stuff where there could be RACE that breaks unique-togher requirement on model
competitor.save()
break
except IntegrityError:
sleep(random.uniform(0.001, 0.5)) # chill out, try again
continue
现在试试这个......