fzou=# CREATE TABLE vis (
fzou(# id serial,
fzou(# is_active boolean
fzou(# );
CREATE TABLE
fzou=#
fzou=# INSERT INTO vis (is_active) VALUES (FALSE);
INSERT 0 1
fzou=#
fzou=# SELECT ctid, xmin, xmax, * FROM vis;
ctid | xmin | xmax | id | is_active
-------+------+------+----+-----------
(0,1) | 1168 | 0 | 1 | f
(1 row)
fzou=# UPDATE vis SET is_active = TRUE;
UPDATE 1
fzou=#
fzou=# SELECT ctid, xmin, xmax, * FROM vis;
ctid | xmin | xmax | id | is_active
-------+------+------+----+-----------
(0,2) | 1169 | 0 | 1 | t
(1 row)
fzou=# begin;
BEGIN
fzou=# UPDATE vis SET is_active = TRUE;
UPDATE 1
fzou=# SELECT ctid, xmin, xmax, * FROM vis;
ctid | xmin | xmax | id | is_active
-------+------+------+----+-----------
(0,3) | 1170 | 0 | 1 | t
(1 row)
fzou=# rollback;
ROLLBACK
fzou=# SELECT ctid, xmin, xmax, * FROM vis;
ctid | xmin | xmax | id | is_active
-------+------+------+----+-----------
(0,2) | 1169 | 1170 | 1 | t
(1 row)
fzou=# select txid_current();
txid_current
--------------
1173
(1 row)
-----
Insert
padmin=# insert into mvcc_test values(1,1);
INSERT 0 1
gpadmin=# insert into mvcc_test values(1,2);
INSERT 0 1
gpadmin=# insert into mvcc_test values(1,3);
INSERT 0 1
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+------+---+---
(0,1) | 27933 | 0 | 1 | 1
(0,2) | 27935 | 0 | 1 | 2
(0,3) | 27961 | 0 | 1 | 3
(3 rows)
Update
gpadmin=# begin;
BEGIN
gpadmin=# update mvcc_test set a=2 where b=2;
UPDATE 1
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+-------+---+---
(0,1) | 27934 | 0 | 2 | 2
(0,1) | 27933 | 0 | 1 | 1
(0,2) | 27935 | 27964 | 1 | 2
(0,3) | 27961 | 0 | 1 | 3
(4 rows)
gpadmin=# commit;
COMMIT
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+-------+---+---
(0,1) | 27934 | 0 | 2 | 2
(0,1) | 27933 | 0 | 1 | 1
(0,2) | 27935 | 27964 | 1 | 2
(0,3) | 27961 | 0 | 1 | 3
(4 rows)
Rollback
gpadmin=# begin;
BEGIN
gpadmin=# update mvcc_test set a=2 where b!=2;
UPDATE 2
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+-------+---+---
(0,1) | 27934 | 0 | 2 | 2
(0,2) | 27938 | 0 | 2 | 1
(0,3) | 27938 | 0 | 2 | 3
(0,1) | 27933 | 27968 | 1 | 1
(0,2) | 27935 | 27964 | 1 | 2
(0,3) | 27961 | 27968 | 1 | 3
(6 rows)
gpadmin=# rollback;
ROLLBACK
Update
gpadmin=# update mvcc_test set a=2 where b!=2;
UPDATE 2
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+-------+---+---
(0,1) | 27934 | 0 | 2 | 2
(0,2) | 27938 | 0 | 2 | 1 --> rollback rows without expired xmax
(0,3) | 27938 | 0 | 2 | 3
(0,4) | 27965 | 0 | 2 | 1
(0,5) | 27965 | 0 | 2 | 3
(0,1) | 27933 | 27995 | 1 | 1
(0,2) | 27935 | 27964 | 1 | 2
(0,3) | 27961 | 27995 | 1 | 3
(8 rows)
VACCUM
gpadmin=# vacuum mvcc_test;
VACUUM
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+------+---+---
(0,1) | 27934 | 0 | 2 | 2
(0,4) | 27965 | 0 | 2 | 1
(0,5) | 27965 | 0 | 2 | 3
(3 rows)
Note: Vacuum will remove all the unused tuples.
DELETE
gpadmin=# begin;
BEGIN
gpadmin=# delete from mvcc_test;
DELETE 3
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+-------+---+---
(0,1) | 27934 | 28263 | 2 | 2
(0,4) | 27965 | 28263 | 2 | 1
(0,5) | 27965 | 28263 | 2 | 3
(3 rows)
gpadmin=# commit;
COMMIT
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
-------+-------+-------+---+---
(0,1) | 27934 | 28263 | 2 | 2
(0,4) | 27965 | 28263 | 2 | 1
(0,5) | 27965 | 28263 | 2 | 3
(3 rows)
gpadmin=# vacuum mvcc_test;
VACUUM
gpadmin=# select ctid,xmin,xmax,* from mvcc_test;
ctid | xmin | xmax | a | b
------+------+------+---+---
(0 rows)
Note: If do the single statement on same ctid tuples, it will generate different xmax.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26477398/viewspace-2140773/
,如需转载,请注明出处,否则将追究法律责任。