# 海山数据库(He3DB)源码详解:MVCC可见性HeapTupleSatisfiesToast函数
本文介绍了事务执行过程中,检查一个Toast元组是否对当前事务可见,用于确保事务可以看到正确的数据版本
HeapTupleSatisfiesToast函数源码解读
HeapTupleSatisfiesToast用于判断一个Toast元组是否满足当前事务的可见性;
函数声明
static bool
HeapTupleSatisfiesToast(HeapTuple htup, Snapshot snapshot,
Buffer buffer)
参数说明:
HeapTuple htup:指向堆元组指针;Snapshot snapshot:元组对应的快照;Buffer buffer:包含堆元组的缓冲区。
函数说明:
HeapTupleSatisfiesToast函数专门用于判断TOAST表中的元组是否满足当前事务的可见性要求,减少对主表的复旦,提高数据库性能。该函数的流程图如下:

函数执行过程
- 获取元组头,并确保元组的自指针和元组的表OID有效
HeapTupleHeader tuple = htup->t_data; Assert(ItemPointerIsValid(&htup->t_self)); Assert(htup->t_tableOid != InvalidOid);
首先,判断Xmin是否提交,如果未提交,执行以下判断:
- 如果Ximin的标志位是无效的,返回False;
if (HeapTupleHeaderXminInvalid(tuple))
return false;
- 如果Xmin的标志位为HEAP_MOVED_OFF,获取Xmin的事务ID
xvac,并判断:
- Xmin事务是否为当前事务,如果是返回False;
- Xmin事务是否在后台运行中,如果不是,则判断事务是否提交:
- Xmin事务已提交,则设置标志位和事务ID为:HEAP_XMIN_INVALID,InvalidTransactionId;
- Xmin事务未提交,则设置标志位和事务ID为:HEAP_XMIN_COMMITTED,InvalidTransactionId;
/* Used by pre-9.0 binary upgrades */
if (tuple->t_infomask & HEAP_MOVED_OFF)
{
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (TransactionIdIsCurrentTransactionId(xvac))
return false;
if (!TransactionIdIsInProgress(xvac))
{
if (TransactionIdDidCommit(xvac))
{
SetHintBits(tuple, buffer, HEAP_XMIN_INVALID,
InvalidTransactionId);
return false;
}
SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED,
InvalidTransactionId);
}
}
- 如果Xmin的标志位为HEAP_MOVED_IN,获取Xmin的事务ID
xvac,并判断:
- Xmin事务是否为当前事务,如果不是,则继续判断:
- Xmin事务是否在后台运行,是则返回False;
- Xmin事务已经提交,则设置标志位和事务ID为:HEAP_XMIN_COMMITTED,InvalidTransactionId;
- Xmin事务没有提交,则设置标志位和事务ID为:HEAP_XMIN_INVALID,InvalidTransactionId;
/* Used by pre-9.0 binary upgrades */
else if (tuple->t_infomask & HEAP_MOVED_IN)
{
TransactionId xvac = HeapTupleHeaderGetXvac(tuple);
if (!TransactionIdIsCurrentTransactionId(xvac))
{
if (TransactionIdIsInProgress(xvac))
return false;
if (TransactionIdDidCommit(xvac))
SetHintBits(tuple, buffer, HEAP_XMIN_COMMITTED,
InvalidTransactionId);
else
{
SetHintBits(tuple, buffer, HEAP_XMIN_INVALID,
InvalidTransactionId);
return false;
}
}
}
- 如果Xmin的事务是无效的,返回False;
else if (!TransactionIdIsValid(HeapTupleHeaderGetXmin(tuple)))
return false;
- 其他情况返回True。
该函数通过检查Xmin事务的状态(是否已提交、是否进行中、是否是当前事务等),来确定TOAST元组对当前事务是否有效,并且通过设置元组的提示位以有优化未来的可见性检查。
True。
该函数通过检查Xmin事务的状态(是否已提交、是否进行中、是否是当前事务等),来确定TOAST元组对当前事务是否有效,并且通过设置元组的提示位以有优化未来的可见性检查。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




