0

我需要借助将同时访问同一个表的并行会话来演示 MVCC 在 PostgreSQL 中的工作。

我不知道该怎么做。请告诉我。

4

1 回答 1

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 中的项目 2,由事务 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 也可以看到新的行版本。

于 2018-12-10T19:17:21.147 回答