1

Я пытаюсь выяснить, если ниже запрос является безопасным для использования для следующего сценария:Atomic UPDATE, чтобы увеличить число в Postgresql

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

Чтобы получить следующую последовательность, я увольняю инструкцию SQL ниже.

WITH updated AS (
    UPDATE sequences SET sequence = sequence + ? 
    WHERE sequence_id = ? RETURNING sequence 
) 
SELECT * FROM updated; 

Моим вопрос: есть запрос ниже сейфа, когда несколько пользователей срабатывали этот запрос в базе данных, в то же время без явного начала транзакции?

Примечание: первый параметр, как правило, 1, но также может быть 10, например, чтобы получить блок 10 новых порядковых номеров

+1

Unrelated, но вы на самом деле не нужно КТР. «Обновление ... возврат» достаточно –

+1

http://www.gplivna.eu/papers/gapless_sequences.htm –

+0

К сожалению, из среды, которую я вынужден использовать, я не могу выполнить оператор UPDATE напрямую и получать все, что угодно вернулся. В качестве обходного пути я должен обернуть его в WITH – Paul

ответ

3

Да, это безопасно.

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

0

Если не поняли вопрос, это то, что тип данных SERIAL для:

https://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-SERIAL

+1

. «SERIAL» оставит пробел в последовательности, если вставка откат. Генератор, основанный на таблицах, будет откат вместе со вставкой, поэтому у него нет этой проблемы. Недостатком является то, что вы блокируете все параллельные вставки до тех пор, пока вы не зафиксируете ... –

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