Как продемонстрировать работу MVCC с несколькими параллельными сессиями в PostgreSQL?
Мне нужно продемонстрировать работу MVCC в PostgreSQL с помощью параллельных сессий, которые будут одновременно обращаться к одной и той же таблице.
Я понятия не имею, как это сделать. Скажи мне, пожалуйста.
1 ответ
Решение
Сессия 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 также видит новую версию строки.