【测试方法】
插入一行数据
session1:开启事务,更新这一行,不提交
session2:select * from t1;
【代码过程】
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
2)如何生成的快照