暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

cxp 2024-12-14
170

# 海山数据库(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元组对当前事务是否有效,并且通过设置元组的提示位以有优化未来的可见性检查。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论