Выполняет ли transaction.atomic откат инкрементов к последовательности pk

Я использую Django 2.2, и мой вопрос заключается в следующем: делает ли transaction.atomic откат приращений к последовательности pk?

Ниже приведена предыстория ошибки, которая привела меня к этой проблеме


Я столкнулся с очень странной проблемой, которую не могу решить, и я надеюсь, что кто-то сталкивался с подобной проблемой.

Вставка с использованием функции django ORM .create() возвращает django.db.utils.IntegrityError: duplicate key value violates unique constraint "my_table_pkey" DETAIL: Key (id)=(5795) already exists.

Отлично. Но потом я смотрю в таблицу, и никакой записи с id=5795 не существует!

SELECT * from my_table where id=5795; показывает (0 rows)

Взгляд на последовательность my_table_id_seq показывает, что она тем не менее увеличилась, чтобы показать last_value = 5795, как будто была вставлена вышеуказанная запись. <<<Более того, проблема возникает не всегда. Успешная вставка с другими данными происходит по адресу id=5796. (Я попробовал сбросить последовательность pk, но это ничего не дало, так как проблема все равно не в этом)

Я совсем запутался в этом, и это вызвало у нас много проблем в одной конкретной таблице. Наконец я понял, что вызов обернут в transaction.atomic и что определенный сценарий может вызывать двойную вставку с тем же pk.

Итак, моя теория такова: Транзакция atomic не откатывает инкремент

Последовательности Postgres не откатываются назад. Каждый раз, когда они затрагиваются оператором, они продвигаются вперед, независимо от того, успешен этот оператор или нет. Для получения дополнительной информации смотрите раздел Notes здесь Create Sequence.

Вернуться на верх