Комментарии 14
UUID надо генерировать при создании сущности в памяти, а не при вставке в базу. Тогда от ORM ничего особенного и не требуется (да, в случае с mysql-ем там свои нюансы, но мы же про постгрес).
У них свои минусы.
просто
Сконвертировать поле и вместо smallserial использовать serial или bigserial — это позволит продлить агонию приложения на месяцы или даже годы.
Серьёзно? У вас были случаи исчерпания диапазона bigserial?
И это очень легко, если приложение делает, например, 1K/sec таких операций: 2^31 / 1000 ops / 86400 sec ~= 25 дней.
bigserial вряд ли удастся застать на своем веку. :)
SELECT -- 0 rows
SELECT -- 0 rows
INSERT
INSERT -- fail
ON CONFLICT — гарантирует, поскольку сначала захватывает блокировку на уникальном ключе:
LOCK(uniqueVal)
LOCK(uniqueVal) -- wait
INSERT
ON CONFLICT
Кстати, Кирилл, можете добавить в вашу статью ещё один способ накрутки счётчика транзакций, о котором мало кто из разработчиков знает.
В PL/pgSQL обработка исключений реализуется при помощи SAVEPOINT. Если в хранимой процедуре/функции имеется блок "EXCEPTION", то при каждом выполнении этого кода будет создаваться SAVEPOINT, и соответственно, будет увеличиваться счётчик транзакций. Если такая функция применяется к возвращаемым строкам запроса, то это может приводить к аварийной остановке кластера, я читал про такие кейсы.
Об этом не сказано в документации, но есть подробный комментарий в исходном коде.
Отсюда вытекает рекомендация. Не используйте обработчики исключений внутри функций, которые вы собираетесь применять к строкам, возвращаемых запросами. Этот механизм предназначен для процедур, реализующих бизнес логику на стороне СУБД,
Можно значительно уменьшить увеличение последовательности при возникновении дубликатов, если переписать запрос
PostgreSQL Antipatterns: накручиваем себе проблемы