1

我有一个 Django 网络应用程序,可以为活动注册竞争对手。当有人注册活动时,他们已登录并填写注册表,然后在视图中检查表格,执行保存(提交 = False)并从现有竞争对手实例中获取最高的竞争对手编号,对于这个新的竞争对手,我将数字设置为最高+1,然后我在

在模型上,我有一个唯一的“竞争对手”模型用于事件和数字,这确保了数字在事件中是唯一的。

现在,对于大型匹配,当许多寄存器同时出现在 save(commit=false) - set number - save() 在同一时间,并尝试 save() 具有相同的数字时,我会遇到一个问题 - 和这会引发一个 IntegrityError,重复键,因为我尝试保存一个具有相同事件和编号的新实例作为在此间隔期间创建的实例。

:-(

现在,关于如何避免这个问题的任何想法或逻辑?

/ 延斯

4

1 回答 1

0

这是我现在如何做到这一点的想法(灵感来自在 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

现在就试试这个...

于 2013-09-10T15:58:11.880 回答