powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT IF NOT EXIST
6 сообщений из 6, страница 1 из 1
INSERT IF NOT EXIST
    #38707523
Phoinix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Есть задача, конкурентно вставлять записи в БД с очень высокой вероятностью нарушения уникальности (unique_violation).
Задача решена на примере статьи: http://doc.prototypes.ru/database/postgresql/recipes/replace/ (последний пример).
Из примера убран UPDATE ввиду его ненадобности.

Интересуют возможные проблемы использования подобного решения.

RETURNING для меня не важен.
Скорость вставки не так критична, количество INSERT вменяемо.

Спасибо.
...
Рейтинг: 0 / 0
INSERT IF NOT EXIST
    #38707543
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Phoinix,
Phoinix убран UPDATE ввиду его ненадобности
а частота удалений важна ?

т.е. ваш скрипт не вставит строку, если она ещё была на момент проверки, но уже удалена на момент коммита вашей транзакции.
это допустимо ? /есть случаи, когда это разрушит логическую целостность/
если нет -- надо подумать о захвате "старой" строки до конца вашей транзакции. (выполнять SELECT FOR UPDATE вместо UPDATE и проверять FOUND -- как в первоисточниках )
...
Рейтинг: 0 / 0
INSERT IF NOT EXIST
    #38707571
Phoinix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, это таблица статистики, то есть, удаление записей из этой таблицы не подразумевается, DELETE можно пренебречь.

SELECT FOR UPDATE не возможен когда строки нет.
Допустим производится параллельная вставка двух строк с одни и тем же уникальным ключем.
- select for update - ничего не заблокирует;
- update ничего не обновит, т.к. еще никто ничего не вставил;
- FOUND (я предпочитаю RETURNING) будет пустой;
- далее 2 insert один из которых вернет EXCEPTION

В общем - не работает так. Без EXCEPTION никак не получается.
...
Рейтинг: 0 / 0
INSERT IF NOT EXIST
    #38709588
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется, что для небольшого потока вставок проще и надежнее всего сериализовать доступ на вставку в таблицу через pg_advisory_xact_lock.
Вы эту статью от Depesz читали?
...
Рейтинг: 0 / 0
INSERT IF NOT EXIST
    #38713958
Phoinix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pg_advisory_lock - использовал давно, в данный момент не использую ввиду неудобства, не хочется делать лишние операции в приложении.

Кстати, если вы сами прочитаете статью, то в качестве последнего примера автор использует в принципе такую же схему что и я с отловом EXCEPTION.
...
Рейтинг: 0 / 0
INSERT IF NOT EXIST
    #38714513
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EXCEPTION относительно дорог, а у вас ' с очень высокой вероятностью нарушения уникальности'. pg_advisory_lock прост, надежен, довольно шустр и безотказен. Впрочем, эту задачу можно решить разными способами. Ваш способ тоже работает.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT IF NOT EXIST
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]