【测试方法】

插入一行数据

session1:开启事务,更新这一行,不提交

session2:select * from t1;mvcc简单示例_c函数

 mvcc简单示例_mvc_02

【代码过程】

HeapTupleSatisfiesMVCC函数

1)session1能看到第二行

1.1) 1015行,TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetRawXmin(tuple) == true

当前事务613,和第二行xmin相等

1.2)  1021行,(tuple->t_infomask & HEAP_XMAX_INVALID),max是0

返回true

 

2)session2能看到第一行

971行,!HeapTupleHeaderXminCommitted(tuple) ,已经提交,不进入if内逻辑

判断tuple二进制的第九位

#2306 = 1001 0000 0010

#& 0x0100

#1001 0000 0010
#      1 0000 0000
&结果=1
取反是0

 

3)session2不能看到第二行

3.1) 971行if判断为true

3.2) 1057行,XidInMVCCSnapshot(HeapTupleHeaderGetRawXmin(tuple), snapshot)==true,return false

都是613

 

【这个快照的逻辑】

1)上面检查在哪获取的这个快照

SeqScanState *node->ss->ss_currentScanDesc->rs_snapshot->xmin

mvcc简单示例_技术_03

2)如何生成的快照