更新:在此处找到答案,建议的解决方法适用于我:How do I deal with this race condition in django?
大家好。请注意以下代码:
while True:
User.objects.get_or_create(email='foo-%d@example.com' % int(time()))
其中User是标准的Django模型,其中unique = True表示电子邮件。当我在几秒钟内同时在两个shell中运行此代码时,我收到如下错误:
IntegrityError: (1062, "Duplicate entry 'foo-1292519049@example.com' for key 'email'")
我的印象是get_or_create()是专为避免这种情况而设计的。看看代码在我看来它应该工作。它首先执行get(),然后如果失败则进入事务并尝试save()。如果失败,它会回滚并再次尝试get()。如果失败则抛出save()的异常,这似乎就是我所得到的。
一些有用的信息 - 我正在使用MySQL v5.1.39和InnoDB运行Django v1.1.0。我们的InnoDB隔离级别是REPEATABLE-READ。
感谢您的帮助!