# 海山数据库(He3DB)源码详解:MVCC可见性HeapTupleSatisfiesSelf函数
本文介绍了事务执行过程中,检查一个堆元组是否对当前事务可见,用于确保事务可以看到正确的数据版本。
HeapTupleSatisfiesSelf
函数源码解读
HeapTupleSatisfiesSelf
:用于判断一个元组是否对当前事务可见;
函数声明
static bool
HeapTupleSatisfiesSelf(HeapTuple htup, Snapshot snapshot, Buffer buffer)
参数说明:
HeapTuple htup
:指向堆元组的指针;Snapshot snapshot
:元组对应的快照;Buffer buffer
:包含堆元组的缓冲区。
函数说明:
该函数用于判断一个元组(tuple)是否对其自身有效,决定了当前事务能否看到某个特定的元组版本。该函数的流程图如下:
HeapTupleSatisfiesSelf
函数过程
- 获取元组头,并确保元组的自指针和元组的表OID有效
HeapTupleHeader tuple = htup->t_data;
Assert(ItemPointerIsValid(&htup->t_self));
Assert(htup->t_tableOid != InvalidOid);
首先,检查Xmin事务是否已经提交,如果没有提交,执行以下过程;
if (!HeapTupleHeaderXminCommitted(tuple))
{
/* 1.检查元组的Xmin有效性 */
/* 2.检查元组是否被标记为HEAP_MOVED_OFF */
/* 3.检查元组是否被标记为HEAP_MOVED_IN */
/* 4.检查Xmin事务ID是否为当前事务 */
/* 5.检查Xmin事务ID是否为在运行中 */
/* 6.检查Xmin事务ID是否为已经提交 */
/* 7.其他(事务中止或系统崩溃) */
}
- 如果Xmin事务已经提交或者中止,返回false;
if (He