Как продемонстрировать работу 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 также видит новую версию строки.

Другие вопросы по тегам