Нужна ли более высокая изоляция транзакций для надежной работы ограничений в PostgreSQL? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть случай, когда мне нужно проверить, существует ли строка, и существует ли она, чтобы не создавать ее снова.Примерно так:

select id from table where constraintA=$1 and constraintB=$2

, следующий сразу после этого в моем коде:

if not exist
insert into table values ($1,$2, {other data})

Чтобы убедиться, что ограничение корректно, я могу создать уникальный индекс, такой как unique(constraintA,constraintB),

Но в https://www.postgresql.org/docs/10/transaction-iso.html говорится, что Postgres использует блокировки строк, а вновь созданные данные изолированы от других одновременных транзакций.Таким образом, они не будут блокировать друг друга, так как я не обновляю и не удаляю данные.

Что приводит меня к моему вопросу, нужен ли уровень изоляции выше read committed, чтобы гарантировать правильность?если нет, верно ли мое понимание?

PS: я использую Postgres 10.5

1 Ответ

1 голос
/ 20 марта 2019

Вы правы, что беспокоитесь, но вы можете рассчитывать на ограничения базы данных, чтобы они работали так, как вы ожидаете, даже в условиях одновременных транзакций.

Ограничения реализованы в виде специальных триггеров в PostgreSQL и задействованы функции триггеров«Сломать» MVCC, сделав новый снимок, на котором также будут видны незафиксированные строки.

Этого нет в обычной документации;для подобных тем документация есть в источнике.См. src/backend/utils/adt/ri_triggers.c, в частности эта часть из RI_Initial_Check.

...