我需要借助并行会话演示MVCC在PostgreSQL中的工作,这些会话将同时访问同一张表。
我不知道该怎么做。 请告诉我。
答案 0 :(得分: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创建的。它是表块0中的项目1。
UPDATE test SET id = 2;
SELECT ctid, xmin, xmax, id FROM test;
ctid | xmin | xmax | id
-------+------+------+----
(0,2) | 5164 | 0 | 2
(1 row)
此更新将插入新的行版本。这是表块0中由交易5164(此交易)创建的项目2。
会议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也看到了新的行版本。