海山数据库(He3DB)源码详解:MVCC可见性HeapTupleSatisfiesToast函数

# 海山数据库(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是否提交,如果未提交,执行以下判断:
  1. 如果Ximin的标志位是无效的,返回False;
	if (HeapTupleHeaderXminInvalid(tuple))
		return false;
  1. 如果Xmin的标志位为HEAP_MOVED_OFF,获取Xmin的事务IDxvac,并判断:
  • 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);
		}
	}
  1. 如果Xmin的标志位为HEAP_MOVED_IN,获取Xmin的事务IDxvac,并判断:
  • 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;
			}
		}
	}
  1. 如果Xmin的事务是无效的,返回False;
	else if (!TransactionIdIsValid(HeapTupleHeaderGetXmin(tuple)))
		return false;
  1. 其他情况返回True。

该函数通过检查Xmin事务的状态(是否已提交、是否进行中、是否是当前事务等),来确定TOAST元组对当前事务是否有效,并且通过设置元组的提示位以有优化未来的可见性检查。

True。

该函数通过检查Xmin事务的状态(是否已提交、是否进行中、是否是当前事务等),来确定TOAST元组对当前事务是否有效,并且通过设置元组的提示位以有优化未来的可见性检查。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值