Как продемонстрировать работу MVCC с несколькими параллельными сессиями в PostgreSQL? - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно продемонстрировать работу MVCC в PostgreSQL с помощью параллельных сессий, которые будут одновременно обращаться к одной и той же таблице.

Я понятия не имею, как это сделать.Скажите, пожалуйста.

1 Ответ

0 голосов
/ 10 декабря 2018

Сессия 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 также видит новую версию строки.

...