Сессия 1:
CREATE TABLE test(id integer);
INSERT INTO test VALUES (1);
START TRANSACTION;
SELECT ctid, xmin, xmax, id FROM test;
ctid | xmin | xmax | id
-------+------+------+----
(0,1) | 5163 | 0 | 1
(1 row)
Эта версия строки была создана транзакцией 5163. Это элемент 1 в табличном блоке 0.
UPDATE test SET id = 2;
SELECT ctid, xmin, xmax, id FROM test;
ctid | xmin | xmax | id
-------+------+------+----
(0,2) | 5164 | 0 | 2
(1 row)
Обновлениевставляет новую версию строки.Это элемент 2 в блоке таблицы 0, созданный транзакцией 5164 (эта транзакция).
Сессия 2:
SELECT ctid, xmin, xmax, id FROM test;
ctid | xmin | xmax | id
-------+------+------+----
(0,1) | 5163 | 5164 | 1
(1 row)
Сессия 2 все еще видит старую версию строкипоскольку транзакция удаления 5164 еще не зафиксирована.
Сессия 1:
COMMIT;
Сессия 2:
SELECT ctid, xmin, xmax, id FROM test;
ctid | xmin | xmax | id
-------+------+------+----
(0,2) | 5164 | 0 | 2
(1 row)
Теперь, когда сеанс 1 зафиксирован, сеанс 2 также видит новую версию строки.