Внимание
Во избежание блокирования параллельных транзакций, пытающихся получить значения одной последовательности, значение, выданное функцией
nextval
, не высвобождается для повторного использования, если вызывающая транзакция впоследствии прерывается. Это означает, что в случае сбоев базы данных или прерывания транзакций в последовательности задействованных значений могут появляться пропуски. Пропуски могут появиться и без прерывания транзакции. Например, команда
INSERT
с предложением
ON CONFLICT
вычислит кортеж, претендующий на добавление, произведя все требуемые вызовы
nextval
, прежде чем выявит конфликты, которые могут привести к отработке правил
ON CONFLICT
вместо добавления. Таким образом, объекты последовательностей
Postgres Pro
не годятся для получения непрерывных последовательностей
.
В том же ключе изменения состояния последовательности, произведённые функцией
setval
, сразу же становятся видимыми для других транзакций и не отменяются при откате транзакции, вызвавшей эту функцию.
Если кластер базы прерывает работу до фиксации транзакции, содержащей вызов функции
nextval
или
setval
, изменение состояния последовательности может не попасть в постоянное хранилище, поэтому неизвестно, какое состояние будет иметь последовательность после перезапуска кластера: исходное или изменённое. Это не создаёт проблем при использовании последовательности внутри базы данных, так как другие изменения незафиксированных транзакций также не будут видны. Однако если значение последовательности будет сохраняться и использоваться вне базы данных, следует предварительно убедиться в том, что вызов функции
nextval
успешно зафиксирован.
Последовательность, с которой будет работать любая из вышеописанных функций, определяется аргументом типа
regclass
, который представляет собой просто OID последовательности в системном каталоге
pg_class
. Однако вам не нужно вручную вычислять OID, так как процедура ввода значения
regclass
может сделать это за вас. За подробностями обратитесь к
Разделу 8.19
.