Включить / отключить проверку уникальных ограничений - PullRequest
0 голосов
/ 19 сентября 2018

Мне было интересно, есть ли способ включить или отключить проверку ограничения UNIQUE в PostgreSQL или есть какой-то другой способ разрешить дублирование записей.

В данный момент я используюхранимая процедура, имеющая параметр check duplicate:

  • Если аргумент true, то код запускает IF EXISTS (SELECT TRUE FROM table WHERE column = column_to_insert) и выдает исключение DuplicateKeyException.

  • Если check duplicate равен false, он просто выполняет INSERT.

Но я подозреваю, что это решение не безопасно для состояния гонки.

1 Ответ

0 голосов
/ 19 сентября 2018

Ваша функция небезопасна, поскольку возможна одновременная транзакция, которую

  1. запущена до того, как ваша INSERT

  2. еще не былазавершается, когда выполняется проверка IF EXISTS

  3. вставляет конфликтующую строку

Тогда вы получите непреднамеренный дубликат.

Вы можете превратить SELECT в SELECT ... FOR UPDATE, чтобы уменьшить окно для состояния гонки, но вы не сможете закрыть его, если не используете SERIALIZABLE уровень изоляции транзакции.

и функциюне защищает вас от того, что кто-то потом вставит дубликат для значения, которое вам не нужно.

Возможно, триггер BEFORE и сериализуемые транзакции - лучший способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...