ITPub博客

首页 > 数据库 > 数据库开发技术 > How MVCC work

How MVCC work

原创 数据库开发技术 作者:fiona8953 时间:2017-06-15 10:53:53 0 删除 编辑


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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 数据包分析
请登录后发表评论 登录
全部评论

注册时间:2014-06-13

  • 博文量
    284
  • 访问量
    222481