Серийные вставки PostgreSQL с чередованием порядковых номеров - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть несколько процессов, вставляемых в таблицу Postgres (10.3) с использованием уровня изоляции SERIALIZED.

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

select * from table where sequanceNum > 2309 limit 5

и затем получить порядковые номера 2310, 2311, 2312, 2313 и 2314.

Запрос на чтение использует READCOMMITTED изоляциюlevel.

Однако я вижу, что запрос на чтение получает только строки, которые я выделил желтым цветом.Глядя на xmin, я предполагаю, что транзакция 334250 началась, но не закончилась, затем транзакции 334251, 334252 и др. Начались и закончились до начала моего запроса на чтение.

У меня вопрос, как они получили последовательностьномера чередуются в 334250?Почему эти транзакции не были заблокированы в результате сериализации всех транзакций записи?

Есть какие-либо предложения о том, как добиться того, чего я хочу?Что является гарантией того, что разные транзакции не генерируют чередующиеся порядковые номера?(Это нормально, если есть пробелы .... но они не могут чередоваться).

Большое спасибо за вашу помощь.Я теряю волосы из-за этого!

PS - я только что заметил, что 334250 имеет ненулевое значение xmax.Может быть, это ключ, который я упускаю?

enter image description here

1 Ответ

0 голосов
/ 20 сентября 2018

Стандарт SQL в своей обычной краткости определяет SERIALIZABLE как:

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

В свете этого определения я понимаю, что вы хотите, чтобы порядковые номера были втот же порядок, что и «последовательное выполнение», которое «производит тот же эффект».

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

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

В некотором смысле вам понадобятся порядковые номера, которые определяются чем-тоэто не точно, пока транзакции не будут зафиксированы, и это противоречит в терминах.

Так что я думаю, что невозможно получить то, что вы хотите, если вы на самом деле не сериализуете выполнение, например, блокируя таблицу вSHARE ROW EXCLUSIVE режим до вставки данных.

У меня вопрос , почему у вас такой необычный спрос.Я не могу придумать вескую причину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...