Почему значения xmin и xmax совпадают в PostgreSQL?
Я изучал 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
1 ответ
xmax
выполняет двойную функцию: используется для обозначения видимости (вместе с xmin
, но он также используется для блокировки строк.
Для устранения неоднозначности между этими двумя состояниями используется статус транзакции и используются дополнительные "невидимые" флаги в кортеже.
Поэтому, если вы видите строку, в которой два значения идентичны, транзакция, которая создала строку, также заблокировала строку. Обычно это признак того, что кортеж был создан с INSERT ... ON CONFLICT
,
Смотрите этот ответ и мой блог для получения дополнительной информации.