Я изучал MVCC в PostgreSQL. Как я понял, при обновлении строки будет добавлена новая строка, а значение xmax в старой строке будет иметь значение xmin вновь добавленной строки.
Когда я проверил это в таблице, которая есть в моей базе данных Postgres, значения xmin и xmax совпадают. Что это означает?
xmin | xmax | id | serial | paid
----------+----------+----------+----------------+------
54569114 | 54569114 | 11099324 | 76605297311437 | t
54569111 | 54569111 | 11099323 | 38131108141783 | t
54569101 | 54569101 | 11099322 | 49399633274146 | t
54569092 | 0 | 11099321 | 44672543705101 | f
54569090 | 54569090 | 11099320 | 21324499293647 | t
54569083 | 0 | 11099319 | 82878160317074 | f
54569079 | 54569079 | 11099318 | 31091666079121 | t





xmax выполняет двойную функцию: используется для обозначения видимости (вместе с xmin, но также используется для хранения рядные замки.
Для устранения неоднозначности между этими двумя состояниями используются статус транзакции и дополнительные «невидимые» флаги в кортеже.
Поэтому, если вы видите строку, в которой два значения идентичны, транзакция, которая создала строку, также заблокировала строку. Обычно это признак того, что кортеж был создан с помощью INSERT ... ON CONFLICT.
См. этот ответ и мой пост в блоге для получения дополнительной информации.
Как я уже сказал, транзакция, создавшая строку, должна была ее заблокировать. Попробуйте узнать точную последовательность операторов SQL, тогда вы сможете понять, как это произошло.
Некоторые записи имеют
0значение вxmax.xmaxзначения становятся идентичными после обновления строки. Если вы заметили, то в строках, гдеxminиxmaxсовпадают, заплачено верно. Поскольку это таблица счетов-фактур, и когда оплата будет произведена, счет-фактура будет обновлен.