#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:
Даже если вы не используете явные транзакции, не гарантируется, что оператор, который получает меньшее значение последовательности, также будет зафиксирован первым.