尽管transaction.atomic(),Django1.6 IntegrityError?

时间:2014-07-02 05:56:02

标签: python concurrency atomic gunicorn django-1.6

transaction.atomic()内,我正在删除并重新创建对象。 Django坐在一个三人工作的枪支后面,数据库是postgres。

问题:当同时使用大量请求访问服务器时,Django正在抛出一些 IntegrityErrors

IntegrityError: duplicate key value violates unique constraint "atomic_atomictest_name_key"
DETAIL:  Key (name)=(foo) already exists.

示例:

models.py

class AtomicTest(models.Model):
    name = models.TextField(null=False, unique=True)

views.py

def test_atomic(request):
    with transaction.atomic():
        models.AtomicTest.objects.filter(name='foo').delete()
        models.AtomicTest(name='foo').save()
    return http.HttpResponse('OK')

IntegrityErrors 不应该出现在我的理解中。任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:2)

IntegrityError仍可以transaction.atomic()发生。交易可以同时进行;它们只是相互隔离,直到它们被提交为止,此时它由Postgres来尝试和解变化。如果Postgres决定一个或多个事务正在尝试创建违反您的唯一性约束的行,它将回滚这些事务。

transaction.atomic()做的是确保如果其中任何一个命令失败,则回滚块中的所有命令。这样你就不会有delete()成功并且已经提交但save()失败的情况。

在这种情况下,transaction.atomic()实际上可能会导致您的问题,因为它会导致delete()延迟立即生效。