表级隐含字段: xmin 和 xmax

http://francs3.blog.163.com/blog/static/40576727201121021753352/


xmin 
       The identity (transaction ID) of the inserting transaction for this row version.
(A row version is an individual state of a row; each update of a row creates a new row 
version for the same logical row.)


xmax
       The identity (transaction ID) of the deleting transaction, or zero for an undeleted
row version. It is possible for this column to be nonzero in a visible row version. That 
usually indicates that the deleting transaction hasn it committed yet, or that an attempted 

deletion was rolled back.

根据上面讲解,可以知道 xmin,xmax都指事务ID(transaction ID), 简单的说,xmin记录的是当数据
插入( Insert )时的事务ID,xmax记录的是当行上的数据有变动(delete or update )时的事务ID,下
面看下详细的实验过程。


1 测试环境准备
--创建测试表并插入数据
skytf=> create table test_17 (id integer ,name varchar(32));
CREATE TABLE

skytf=> insert into test_17 select generate_series(1,10),'a';
INSERT 0 10

--查询表 test_17信息
skytf=> select xmin,xmax,ctid,* from test_17;
   xmin   | xmax |  ctid  | id | name 
----------+------+--------+----+------
 14240187 |    0 | (0,1)  |  1 | a
 14240187 |    0 | (0,2)  |  2 | a
 14240187 |    0 | (0,3)  |  3 | a
 14240187 |    0 | (0,4)  |  4 | a
 14240187 |    0 | (0,5)  |  5 | a
 14240187 |    0 | (0,6)  |  6 | a
 14240187 |    0 | (0,7)  |  7 | a
 14240187 |    0 | (0,8)  |  8 | a
 14240187 |    0 | (0,9)  |  9 | a
 14240187 |    0 | (0,10) | 10 | a
(10 rows)   


      这里看到, 表 test_17 里有十条数据,并且这10条数据的 xmin 都为 14240187 , xmax 值都为 0
  14240187 即为事务ID,下面可以进一步地测试
  
2 测试场景一  xmin值是如何而来?
--开启一事务
skytf=> begin;
BEGIN
 
skytf=> select txid_current();
 txid_current 
--------------
     14240188
(1 row)

skytf=> select txid_current();
 txid_current 
--------------
     14240188
(1 row)

skytf=> insert into test_17 values (11,'b');
INSERT 0 1

skytf=> end;
COMMIT

--上面事务提交后,查询 xmin
skytf=> select xmin,xmax,ctid,* from test_17 where id=11;
   xmin   | xmax |  ctid  | id | name 
----------+------+--------+----+------
 14240188 |    0 | (0,11) | 11 | b
(1 row)

     可以看到 14240188 即为开始 INSERT 数据时的事务ID。
   
   
3 测试场景二  xmax
--查询表 test_17信息
skytf=> select xmin,xmax,ctid,* from test_17;
   xmin   | xmax |  ctid  | id | name 
----------+------+--------+----+------
 14240187 |    0 | (0,1)  |  1 | a
 14240187 |    0 | (0,2)  |  2 | a
 14240187 |    0 | (0,3)  |  3 | a
 14240187 |    0 | (0,4)  |  4 | a
 14240187 |    0 | (0,5)  |  5 | a
 14240187 |    0 | (0,6)  |  6 | a
 14240187 |    0 | (0,7)  |  7 | a
 14240187 |    0 | (0,8)  |  8 | a
 14240187 |    0 | (0,9)  |  9 | a
 14240187 |    0 | (0,10) | 10 | a
 14240188 |    0 | (0,11) | 11 | b
(11 rows)

  大家可以看到, xmax 值为0,那什么情况下 xmax 值不为0呢,有几种情况,接下来看
  
  
3.1 情况一: deleting事务未提交
--会话一:开启一事务
skytf=> begin;
BEGIN
skytf=> select txid_current();
 txid_current 
--------------
     14240189
(1 row)

skytf=> delete from test_17 where id=11;
DELETE 1
skytf=>

    会话一开启一个事务,并删除一条数据,并不 commit,此时开启另一会话。

--另开一个会话查询 
skytf=> select xmin,xmax,ctid,* from test_17;
   xmin   |   xmax   |  ctid  | id | name 
----------+----------+--------+----+------
 14240187 |        0 | (0,1)  |  1 | a
 14240187 |        0 | (0,2)  |  2 | a
 14240187 |        0 | (0,3)  |  3 | a
 14240187 |        0 | (0,4)  |  4 | a
 14240187 |        0 | (0,5)  |  5 | a
 14240187 |        0 | (0,6)  |  6 | a
 14240187 |        0 | (0,7)  |  7 | a
 14240187 |        0 | (0,8)  |  8 | a
 14240187 |        0 | (0,9)  |  9 | a
 14240187 |        0 | (0,10) | 10 | a
 14240188 | 14240189 | (0,11) | 11 | b
(11 rows)

       发现 id为 11的记录的 xmax 变为 14240189 了。有兴趣的可以测试下
updating 事务未提交的场景,和这个结果类似,这里不再详述。 
    
3.2 情况二: deleting 事务 rollback   

--开启事务

skytf=> begin;
BEGIN
skytf=> select txid_current();
 txid_current 
--------------
     14240190
(1 row)

skytf=> delete from test_17 where id=10;
DELETE 1
skytf=> rollback;
ROLLBACK

--再次查询表信息
skytf=> select xmin,xmax,ctid,* from test_17;
   xmin   |   xmax   |  ctid  | id | name 
----------+----------+--------+----+------
 14240187 |        0 | (0,1)  |  1 | a
 14240187 |        0 | (0,2)  |  2 | a
 14240187 |        0 | (0,3)  |  3 | a
 14240187 |        0 | (0,4)  |  4 | a
 14240187 |        0 | (0,5)  |  5 | a
 14240187 |        0 | (0,6)  |  6 | a
 14240187 |        0 | (0,7)  |  7 | a
 14240187 |        0 | (0,8)  |  8 | a
 14240187 |        0 | (0,9)  |  9 | a
 14240187 | 14240190 | (0,10) | 10 | a
(10 rows)

   发现 id为 10 的记录的 xmax 变为 14240190 了。

3.3 情况三: updating 事务 rollback   
--开启事务
skytf=> begin;
BEGIN
skytf=> select txid_current();
 txid_current 
--------------
     14240191
(1 row)

skytf=> update test_17 set name='aaa' where id=1;
UPDATE 1

skytf=> rollback;
ROLLBACK

--再次查询表信息
skytf=> select xmin,xmax,ctid,* from test_17;
   xmin   |   xmax   |  ctid  | id | name 
----------+----------+--------+----+------
 14240187 | 14240191 | (0,1)  |  1 | a
 14240187 |        0 | (0,2)  |  2 | a
 14240187 |        0 | (0,3)  |  3 | a
 14240187 |        0 | (0,4)  |  4 | a
 14240187 |        0 | (0,5)  |  5 | a
 14240187 |        0 | (0,6)  |  6 | a
 14240187 |        0 | (0,7)  |  7 | a
 14240187 |        0 | (0,8)  |  8 | a
 14240187 |        0 | (0,9)  |  9 | a
 14240187 | 14240190 | (0,10) | 10 | a
(10 rows)

    上面可以看到,id=1 的行的 xmax 值 变为 14240191。
    
总结     1  xmin,xmax 都指事务ID  (transaction ID) 
            2  xmin记录的是当数据插入( Insert )时的事务ID 
            3  xmax记录的是当行上的数据有变动(delete or update )时的事务ID,有两种情况
               A: deleting/updating 事务未提交;  B:  deleting/updating 事务 rollback


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值