Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / INSERT IF NOT EXIST / 6 сообщений из 6, страница 1 из 1
28.07.2014, 17:56:44
    #38707523
Phoinix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT IF NOT EXIST
Доброго времени суток.

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

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

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

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

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

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

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

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


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