大云海山数据库(He3DB)源码详解:He3DB-MultiXactIdCreateFromMembers

大云海山数据库(He3DB)源码详解:He3DB-SubTrans日志管理器函数之SubTransGetParent、SubTransGetTopmostTransaction 函数名作用获取目标事务的父事务id获取给定TransactionId的顶层事务ID。 阅读详情

# 大云海山数据库(He3DB)源码详解:He3DB-MultiXactIdCreateFromMembers

背景

大云He3DB 采用了先进的存储引擎和查询优化技术,能够快速处理大量数据和复杂查询。无论是 OLTP(在线事务处理)还是 OLAP(在线分析处理)场景,都能提供出色的性能表现。He3DB 具备完善的数据备份和恢复机制,能够在系统故障或数据损坏时快速恢复数据,确保业务的连续性。He3DB 支持水平扩展和垂直扩展,可以轻松应对不断增长的数据需求。He3DB 提供了严格的访问控制和数据加密功能,确保数据的安全性和隐私性。

本文基于大云He3DB,针对MultiXactIdCreateFromMembers进行源码解读分享

MultiXactIdCreateFromMembers

源码解读

MultiXactId
MultiXactIdCreateFromMembers(int nmembers, MultiXactMember *members)
{
	LOG_FUNCTION_ENTRY();
	MultiXactId multi; //用于存储新创建的 MultiXactId
	MultiXactOffset offset;//用于存储新分配的偏移量
	xl_multixact_create xlrec; //用于存储 XLOG 记录的结构体,记录多事务的创建信息

	debug_elog3(DEBUG2, "Create: %s",
				mxid_to_string(InvalidMultiXactId, nmembers, members));

	/*
如果缓存中已经存在相同的成员集合,则直接返回已存在的 MultiXactId,避免重复创建
	 */
	multi = mXactCacheGetBySet(nmembers, members);//检查本地缓存中是否已经存在相同的成员集合
	if (MultiXactIdIsValid(multi))//检查返回的 MultiXactId 是否有效
	{
		debug_elog2(DEBUG2, "Create: in cache!");
		LOG_FUNCTION_EXIT();
		return multi;
	}

	/* 确保成员中只有一个事务是更新事务(ISUPDATE_from_mxstatus 检查成员状态) */
	{
		int i = 0;
		bool		has_update = false;

		/*
		遍历所有成员,检查是否有多个更新事务。
		如果发现多个更新事务,抛出错误。
		如果只有一个更新事务,记录 has_update 为 true
		*/
		for (i = 0; i < nmembers; i++)
		{
			if (ISUPDATE_from_mxstatus(members[i].status))
			{
				if (has_update) {
					elog(ERROR,
					     "new multixact has more than one updating member: %s",
					     mxid_to_string(InvalidMultiXactId, nmembers, members));
				}
				has_update = true;
			}
		}
	}

	multi = GetNewMultiXactId(nmembers, &offset); //分配一个新的 MultiXactId 和对应的偏移量范围

	/* 创建 XLOG 记录 */
	xlrec.mid = multi;
	xlrec.moff = offset;
	xlrec.nmembers = nmembers;
	XLogBeginInsert();
	XLogRegisterData((char *) (&xlrec), SizeOfMultiXactCreate);
	XLogRegisterData((char *) members, nmembers * sizeof(MultiXactMember));
	(void) XLogInsert(RM_MULTIXACT_ID, XLOG_MULTIXACT_CREATE_ID);//将 XLOG 记录写入 WAL 日志


	/* 将多事务信息写入 OFFSET 和 MEMBER 日志文件 */
	RecordNewMultiXact(multi, offset, nmembers, members);

	END_CRIT_SECTION();

	/*将新创建的多事务 ID 和成员信息存入本地缓存*/
	mXactCachePut(multi, nmembers, members);

	debug_elog2(DEBUG2, "Create: all done");

	LOG_FUNCTION_EXIT();
	return multi;//返回新创建的 MultiXactId
}

函数流程图

该函数流程图如下所示:

请添加图片描述

流程图解释

  1. 开始:

    • 函数开始执行。
  2. 检查缓存:

    • 尝试从本地缓存中查找是否存在相同的成员集合。
  3. 缓存中是否存在相同的成员集合?:

    • 如果存在,直接返回缓存中的 MultiXactId,结束流程。
    • 如果不存在,继续执行。
  4. 验证成员:

    • 检查成员集合是否合法(例如,是否只有一个更新事务)。
  5. 成员中是否只有一个更新事务?:

    • 如果是,继续执行。
    • 如果不是,抛出错误,结束流程。
  6. 分配新的 MultiXactId 和偏移量:

    • 生成新的 MultiXactId 和偏移量。
  7. 记录 XLOG:

    • 将新的 MultiXactId 和成员信息记录到 XLOG(WAL 日志)。
  8. 记录到 OFFSETs 和 MEMBERs 日志:

    • 将信息写入到 OFFSETs 和 MEMBERs 文件。
  9. 结束关键段:

    • 结束关键段,确保操作的原子性。
  10. 更新本地缓存:

    • 将新的 MultiXactId 和成员信息存储到本地缓存。
  11. 返回新的 MultiXactId:

    • 函数返回新创建的 MultiXactId。
  12. 结束:

    • 函数执行完成。

函数调用栈

通过source insight可以查看函数的调用栈

source insight安装流程可以参考这篇文章:Source insight 工具安装及使用方法

总结

本文基于大云He3DB,针对MultiXactIdCreateFromMembers 进行源码解读分享。

MultiXactIdCreateFromMembers 函数的主要逻辑如下:
检查本地缓存中是否已经存在相同的成员集合,避免重复创建。
验证成员中是否只有一个更新事务,确保多事务的合法性。
分配新的 MultiXactId 和偏移量。
创建 XLOG 记录,描述新创建的多事务。
将多事务信息写入 OFFSET 和 MEMBER 日志文件。
将新创建的 MultiXactId 存入本地缓存,提高后续查找的效率。
这个函数的关键在于处理并发问题,确保多事务的创建过程是线程安全的,并通过缓存机制提高性能。

其余文章参考链接

大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之TransactionIdSetTreeStatus

大云海山数据库(He3DB)+AI(五):一种基于强化学习的数据库旋钮调优方法

大云海山数据库(He3DB)+AI(四):一种基于迁移学习的启发式数据库旋钮调优方法

大云海山数据库(He3DB)源码解读:海山PG 词法、语法分析

大云海山数据库(He3DB)源码详解:海山PG 空闲空间映射表FSM

大云海山数据库(He3DB)源码详解:主备复制SyncRepWaitForLSN

作者信息

公司职位
中移苏研助理软件研发工程师
大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之WriteZeroPageXlogRec、CheckPointCLOG 函数作用创建一个新CLOG日志页面时,调用该函数创建一条ZEROPAGE的XLOG日志记录,以记录所创建CLOG日志页面的页面号,方便系统崩溃或恢复过程中重建CLOG日志。 阅读详情

相关推荐

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

海山数据库(He3DB)源码详解:MVCC可见性HeapTupleSatisfiesSelf函数本文介绍了事务执行过程中,检查一个堆元组是否对当前事务可见,用于确保事务可以看到正确的数据版本。

He3DB_ht的博客 935

大云海山数据库(He3DB) 内核分析-子查询优化

文章摘要:本文分析了He3DB中子查询优化的实现,重点探讨了子连接上拉和子查询上拉两种优化技术。子连接上拉主要处理EXISTS_SUBLINK和ANY_SUBLINK类型,将其转换为半连接或反连接;子查询上拉则通过pull_up_subqueries_recurse函数实现,需满足特定条件才能提升简单子查询。文章详细说明了各类子查询的转换条件、处理流程及代码实现逻辑,揭示了He3DB子查询优化的实现机制与限制。

weixin_43544348的博客 1074

别再让步进电机‘发烧’了!用FOC闭环驱动实现精准力矩控制(基于P0斩波恒流版)

本文详细介绍了如何利用FOC闭环驱动技术(基于P0斩波恒流版)解决步进电机过热和力矩控制不精准的问题。通过对比传统开环控制的缺陷,展示了FOC在降低温度、提升精度和能效方面的显著优势,并提供了硬件配置、软件实现及性能优化的完整方案。

weixin_30872157的博客 567

移动云大云海山数据库(He3DB)基于postgresql_anonymizer插件动态数据脱敏用法

本文将详细介绍 postgresql_anonymizer 插件的核心用法,包括脱敏规则配置(静态绑定与动态绑定)、权限管理、脱敏效果验证、规则维护及高级应用场景,帮助用户快速掌握基于海山数据库实现动态数据脱敏的实操方案,为业务场景中的敏感数据提供全方位保护。李*明 | 139****4321 | 310101********6789 | li****@example.com。王* | 137****3344 | 440101********4321 | wa****@example.com。

weixin_43544348的博客 648

CATIA高效设计:自定义快捷键全攻略

本文详细介绍了如何在CATIA中自定义快捷键以提升设计效率。通过减少鼠标依赖、优化工作流程和减轻手腕疲劳,合理设置快捷键可显著提高建模速度。文章提供了从基础设置到高级配置的全流程指南,包括解决冲突、推荐方案及外设扩展建议,帮助用户快速掌握CATIA高效设计技巧。

weixin_42648844的博客 584

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

本文借助easyx库函数(提供下载链接),很方便地用C语言实现了鼠标、按钮、进度条、坐标尺等操作,为普通C程序的友好人机交互界面提供了一种简单便捷的方案。

体会编程语言独到的美 17万+

大云海山数据库(He3DB)源码详解:He3DB-SimpleLruReadPage

本文基于大云He3DB,针对SimpleLruReadPage进行源码解读分享。函数名作用SimpleLruReadPage 函数的作用是从 SLRU 缓冲区中读取一个页面。它通过以下步骤实现:检查页面是否已在内存中。如果页面正在被读取或写入,等待 I/O 完成。如果页面不在内存中,选择一个空闲槽位。从磁盘读取页面数据到槽位。更新页面状态并返回槽号。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 1114

告别臃肿VS!仅用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境

本文详细介绍了如何仅使用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境,避免安装臃肿的完整VS。通过精准选择组件、配置Qt Creator编译器和优化Kit设置,实现高效、精简的Windows平台Qt开发环境搭建,特别适合追求性能和资源优化的开发者。

weixin_30340617的博客 350

大云海山数据库(He3DB) 内核分析 — Btree索引篇

本文重点分析了He3DB数据库中B-Tree索引的实现原理。首先介绍了B+Tree的基本结构特点,包括键值存储在叶子节点、叶子节点双向链接等。随后详细阐述了索引的创建过程,包括元组转换、排序、页面填充及B+Tree构建等关键步骤。在查询方面,解释了索引扫描的工作原理及与回表操作的配合机制。对于数据更新,分析了索引插入时的页面分裂处理流程,以及删除操作中标记删除与物理删除的区别。最后总结了B+Tree索引在等值和范围查询中的优势,并指出其内部节点与叶子节点的不同指向特点。

weixin_43544348的博客 1043

人工智能发展史(从起步到磅礴)以及浪潮阶段

随机森林是将多个有差异的弱学习器(决策树)Bagging并行组合,通过建立多个的拟合较好且有差异模型去组合决策,以优化泛化性能的一种集成学习方法。从论文里可以了解到,GPT-1具有1.17个参数,采用了12层的Transformer 解码器结构,使用5GB的无标注文本数据,在8个GPU上训练了一个月,然后再进行人工监督的微调。训练相结合的理念(该方法在当时计算力上还是有很多挑战,基本上都是和链式求导的梯度算法相关的),这也解决了单层感知器不能做非线性分类的问题,开启了神经网络新一轮的高潮。

xiao77224li的博客 7505

基于Linux的PCIe设备驱动开发入门到精通-- 11.2 锁机制与并发控制 (自旋锁、互斥锁) 11.3 性能瓶颈分析与优化建议

本文探讨Linux驱动开发中的性能优化方法论,重点聚焦并发控制与性能瓶颈分析。从锁机制选择(自旋锁、互斥锁等)到工具使用(ftrace、perf),详细介绍了定位锁竞争和CPU热点的实战步骤,包括ftrace事件跟踪和perf火焰图分析。针对常见性能瓶颈(CPU/内存/I/O/锁竞争),提出了锁粒度优化、无锁结构替换、中断处理优化等解决方案。强调性能优化需要理论结合实践,通过"假设-测量-验证"的循环持续迭代。为开发者提供了一套从问题定位到解决的完整方法论,助力开发高性能工业级驱动。

MHD0815的博客 127

大云海山数据库(He3DB)AutoVacuum源码解析

AutoVacuum是数据库基于MVCC(多版本并发控制)机制设计的自动化维护功能,其核心价值在于解决MVCC带来的固有问题,规避手动维护短板,保障数据库长期稳定运行,具体原因如下:1、 解决表膨胀问题:数据库执行update/delete操作时,不会直接删除旧元组,仅标记为“死元组”以保障并发事务可见性。这些死元组长期堆积会占用大量磁盘空间,导致表和索引体积膨胀,大幅增加查询扫描范围,降低执行效率,AutoVacuum可及时清理此类无效数据。

weixin_43544348的博客 729

【ArcGIS遇上Python】ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换

由于论文的需要,将MODIS NDVI数据进行投影变换和格式转换,具体操作可以参照:《ArcGIS10.8完美实现MODIS NDVI数据格式转换和投影变换》,但是该文章中的做法只能一次性实现一景影像的转换,没法批量,虽然ArcGIS中提供了Batch的方法但是需要挨个添加数据,确定输出路径等等,本文就实现以ArcGIS10.8 Python代码批量完美实现MODIS NDVI数据格式转换和投影变换。先来看投影后的效果: 在实现批量投影转换之前,需要两个投影文件:Sinusoidal.prj和MyAl

智慧空间实验室 3815

大云海山数据库(He3DB)兼容 MySQL 日期函数:DATE_ADD的内核实现与复合间隔支持

本文针对大云海山数据库(He3DB)兼容MySQL生态时缺乏DATE_ADD和DATE_SUB函数的问题,提出了一种内核级解决方案。通过在语法解析器和时间处理模块中新增C函数,实现了对MySQL特有的11种复合时间间隔格式的完整支持。该方案采用"语法扩展+格式转换+原生运算"的三层架构,成功实现了与MySQL完全兼容的时间运算功能,显著降低了数据库迁移成本,为异构数据库兼容提供了可复用的技术范式。

weixin_43544348的博客 1219

高分SCI讨论部分必学AI写作套路!仅需五步结合GPT‑5辅助,让你的SCI论文更有说服力(附实用AI提示词)

对于很多写SCI论文的学术人来说,其实“讨论部分”才是最致命的,网上虽然有大量的写作技巧和模板提供参考,但往往让人眼花缭乱,还是不知道如何下手。即便是下手了,也很难兼顾学术性与可读性,实际上讨论部分的难点并不在于写,而在于你能研究结果说清楚。今天七哥教你借助GPT-5,用五步法结合精心设计的AI提示词,让你能在科学逻辑与语言表达上一次性解决“讨论部分”的结构、内容、润色和翻译问题,轻松写出符合高分SCI期刊要求的讨论段落。

智能AI让学术科研更容易 1330

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大云海山数据库(He3DB)源码详解:He3DB-CLOG日志管理器函数之TransactionIdGetStatus

函数名作用实现CLOG日志的读操作。

weixin_51457815的博客 418

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

速来了解!大云海山数据库考试认证即将开启

中国移动自主研发的“大云海山数据库”获得国家安全可靠认证,成为国内电信运营商首款通过该项测评的数据库产品,标志着我国在数据库领域的自主创新取得重要突破。近日,中国信息安全测评中心与国家保密科技测评中心联合发布《安全可靠测评结果公告(2025年第2号)》,中国移动自主研发的移动云大云海山数据库(He3DB for PostgreSQL V2.0)获得认证。这是国内电信运营商首款通过“安全可靠测评”的数据库产品,彰显了中国移动在数据库核心技术、安全保障、售后维护和持续发展方面的实力。

huanhuanzhou blog 747

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

移动云大云海山数据库(He3DB)B树索引

B树索引是数据库使用场景中最常见的索引。移动云大云海山数据库的B树索引实际上是一种B+树。本文主要介绍数据库的B树索引页面、B树索引结构,以及B树索引创建和插入的过程。在src/backend/access/nbtree/nbtree.c的函数bthandler中,可以找到B树索引的所有入口函数。索引创建:btbuild索引插入:btinsert索引删除:btbulkdelete、btvacuumcleanup。

weixin_43544348的博客 690

移动云大云海山数据库(He3DB)与PolarDB架构深度对比(一)

本文聚焦二者核心架构能力,从技术演进、整体架构、存储设计、数据访问、持久化、数据一致性六大核心维度,深度拆解海山数据库与PolarDB的底层实现差异、技术选型思路及各自优劣,为企业数据库技术选型、架构设计提供可落地的实操性参考。基于存储架构的差异点,后续将继续拆解海山数据库与PolarDB架构上的区别,分别从数据访问、数据持久化、数据一致性等数据库基本能力表现出发,详细介绍两者的差异,以体现其架构上的不同。对标研发+本土化适配,紧跟行业技术路线,实现核心能力对标,适配通用部署场景。

weixin_43544348的博客 551
上一篇: 海山数据库(He3DB)源码详解:海山Mysql 崩溃恢复(3)-日志应用
下一篇: 大云海山数据库(He3DB)源码详解:He3DB-SimpleLruReadPage
DAWN1221
博客等级 码龄7年 893粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值