2016-07-06 2 views
0

У меня есть распределенная система, которая должна выполнять операцию атомной базы данных. По сути, приложение должно выполнить команду find or create.Распределенная блокировка и обработка исключений нарушения ограничений для потока управления

Я могу думать о двух вариантах:

A) Используйте распределенную блокировку, чтобы убедиться, что операция является атомарной через процессы/системы. Проверьте, существует ли запись. Получите или создайте запись соответственно.

B) Всегда пытайтесь вставить запись. Разрешить базе данных поднять уникальную ошибку нарушения ограничений и уловить исключение в приложении. Если возникает исключение, то оно существует, поэтому вместо этого записывайте запись.

Опция A кажется более правильный очевидно, но более качественно?

Использование обработки исключений для потока управления вонючее, но действительно ли это ужасно? Я чувствую, что вариант B более читабельен и легче рассуждать. Кроме того, для базы данных не требуется блокировка.

Можете ли вы дать мне конкретную причину не использовать опцию B с конкретными доказательствами?

Спасибо!

ответ

1

Замки, очевидно, стоят дорого; даже если ваши процессы не блокируются при попытке их приобретения, они все равно требуют времени и ресурсов для управления.

Насколько я знаю, повышение исключения не имеет последствий, если оно не вызывает откат некоторых ранее вставленных данных (раздувание таблиц и создание работы для autovacuum).

Но с Postgres 9.5 вы можете сделать то же самое - без запаха - используя инструкцию INSERT ... ON CONFLICT DO NOTHING. Ваша клиентская библиотека должна вернуть количество затронутых строк, которые скажут вам, удалось ли выполнить INSERT.

+0

Спасибо за эту ссылку! Я читал о postgres upsert, но я не думал «ничего не делать». Спасибо за понимание. –

Смежные вопросы