更新:在这里找到了答案,建议的解决方法对我有用:如何在 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。
谢谢您的帮助!