Разрыв автоматической фиксации ПОСЛЕДОВАТЕЛЬНОГО столбца Postgres

#postgresql #autocommit

#postgresql #автоматическая фиксация

Вопрос:

Если у меня есть таблица:

 CREATE TABLE table_name(
    id SERIAL
);
 

И у меня вставлены следующие идентификаторы: …, 68, 69.

Тогда у меня есть 2, и я должен параллельно выполнять конкурирующие транзакции (T1, T2). Я понимаю, что могло случиться так, что завершение транзакции сначала получает большее число, потому что идентификатор присваивается и записывается в WAL перед фиксацией транзакции.

T1 (Take Number = 70), T2 (Take number = 71), T2 (Commit), T1(Commit)

Какова ситуация при автоматической фиксации (при вставке строки вне транзакции). И я должен очень близко вставить идентификатор, гарантирующий, что первая вставленная строка получит меньшее число?

Вариант использования следующий: после вставки строки я бы выполнил SELECT id FROM table_name ORDER BY id . Может ли случиться так, что я выполняю эту команду дважды один за другим, а затем получаю следующий результат:

Выберите 1 результат: 68,69,71

Выберите 2 результата: 68,69,70,71

Комментарии:

1. Вас не должны волновать пробелы в числах. Они нормальные, ожидаемые, и беспокоиться не о чем.

2. «При вставке строки вне транзакции» — вы никогда не сможете работать «вне транзакции». Если вы используете автоматическую фиксацию, каждый оператор представляет собой отдельную транзакцию, но это все равно транзакция.

3. Я бы посоветовал прочитать раздел примечаний к последовательностям . Это объясняет поведение последовательности. В нижней строке будут пробелы, и упорядочение не гарантируется.

4. Речь идет не о пробелах. Мне нужно реализовать последовательность gapleas. Итак, моя идея заключалась в том, чтобы хранить журнал событий с последовательным столбцом. Затем выберите все элементы, которые были добавлены с момента последнего присвоения последовательности. И вычислите мою последовательность без пробелов. Но поскольку кажется, что после того, как я вставлю новый элемент и выберу, элемент из остановленной транзакции может появиться между ними, тогда это не вариант.

Ответ №1:

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