在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 不应该出现在我的理解中。任何人都可以解释原因吗?
答案 0 :(得分:2)
IntegrityError
仍可以transaction.atomic()
发生。交易可以同时进行;它们只是相互隔离,直到它们被提交为止,此时它由Postgres来尝试和解变化。如果Postgres决定一个或多个事务正在尝试创建违反您的唯一性约束的行,它将回滚这些事务。
transaction.atomic()
做的是确保如果其中任何一个命令失败,则回滚块中的所有命令。这样你就不会有delete()
成功并且已经提交但save()
失败的情况。
在这种情况下,transaction.atomic()
实际上可能会导致您的问题,因为它会导致delete()
延迟立即生效。