|
|
|
INSERT IF NOT EXIST
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Есть задача, конкурентно вставлять записи в БД с очень высокой вероятностью нарушения уникальности (unique_violation). Задача решена на примере статьи: http://doc.prototypes.ru/database/postgresql/recipes/replace/ (последний пример). Из примера убран UPDATE ввиду его ненадобности. Интересуют возможные проблемы использования подобного решения. RETURNING для меня не важен. Скорость вставки не так критична, количество INSERT вменяемо. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 17:56:44 |
|
||
|
INSERT IF NOT EXIST
|
|||
|---|---|---|---|
|
#18+
Phoinix, Phoinix убран UPDATE ввиду его ненадобности а частота удалений важна ? т.е. ваш скрипт не вставит строку, если она ещё была на момент проверки, но уже удалена на момент коммита вашей транзакции. это допустимо ? /есть случаи, когда это разрушит логическую целостность/ если нет -- надо подумать о захвате "старой" строки до конца вашей транзакции. (выполнять SELECT FOR UPDATE вместо UPDATE и проверять FOUND -- как в первоисточниках ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 18:14:57 |
|
||
|
INSERT IF NOT EXIST
|
|||
|---|---|---|---|
|
#18+
Нет, это таблица статистики, то есть, удаление записей из этой таблицы не подразумевается, DELETE можно пренебречь. SELECT FOR UPDATE не возможен когда строки нет. Допустим производится параллельная вставка двух строк с одни и тем же уникальным ключем. - select for update - ничего не заблокирует; - update ничего не обновит, т.к. еще никто ничего не вставил; - FOUND (я предпочитаю RETURNING) будет пустой; - далее 2 insert один из которых вернет EXCEPTION В общем - не работает так. Без EXCEPTION никак не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 18:40:22 |
|
||
|
INSERT IF NOT EXIST
|
|||
|---|---|---|---|
|
#18+
Мне кажется, что для небольшого потока вставок проще и надежнее всего сериализовать доступ на вставку в таблицу через pg_advisory_xact_lock. Вы эту статью от Depesz читали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 23:56:24 |
|
||
|
INSERT IF NOT EXIST
|
|||
|---|---|---|---|
|
#18+
pg_advisory_lock - использовал давно, в данный момент не использую ввиду неудобства, не хочется делать лишние операции в приложении. Кстати, если вы сами прочитаете статью, то в качестве последнего примера автор использует в принципе такую же схему что и я с отловом EXCEPTION. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2014, 12:43:21 |
|
||
|
INSERT IF NOT EXIST
|
|||
|---|---|---|---|
|
#18+
EXCEPTION относительно дорог, а у вас ' с очень высокой вероятностью нарушения уникальности'. pg_advisory_lock прост, надежен, довольно шустр и безотказен. Впрочем, эту задачу можно решить разными способами. Ваш способ тоже работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2014, 19:29:46 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=124&tid=1998546]: |
0ms |
get settings: |
7ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
22ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 334ms |

| 0 / 0 |
