海山数据库(He3DB)源码详解:RecordTransactionCommit 函数解读

海山数据库(He3DB)数据仓库发展历史与架构演进:(三)云数仓 数据仓库的演进变革的因素有很多,例如快速的业务模式与群体规模的数据量带来的大数据处理技术、互联网的发展带来的数据源及数据类型的增多、人工智能的发展带来数智的融合、云计算交付模式的出现需要的细粒度的资源管理与隔离等,业务实时性的要求等都会带来数据仓库架构的变化。传统数仓将计算与存储部署在同一个节点,集群的扩容复杂,需要进行数据的迁移,同时架构存在木桶效应,单节点故障会影响整体的性能,且资源管理不灵活,无法满足不同场景下资源隔离及动态调整的需求。,这些产品之间的功能基本相同,只是在技术细节的实现各有不同。 阅读详情

海山数据库(He3DB)源码详解:RecordTransactionCommit 函数解读

RecordTransactionCommit 是 PostgreSQL 中用于记录事务提交的关键函数。它负责在事务结束时执行一系列操作,包括日志记录、清理资源、更新事务状态等。以下是对这个函数的逐行解释:

1. 函数目标

RecordTransactionCommit 的主要目标是:

  1. 记录事务提交的 XLOG(Write-Ahead Logging)记录。
  2. 清理事务相关的资源。
  3. 更新事务状态(如 CLOG)。
  4. 确保在同步提交模式下,所有必要的日志记录都被写入磁盘。

2. 函数逻辑

  1. 获取事务 ID:
  • 如果事务有有效的 XID,进入提交记录的准备阶段。
  • 如果没有有效的 XID,检查是否有待删除的文件或统计信息。
  1. 检查待删除的文件或统计信息:
  • 如果有,抛出错误(不能提交删除文件但没有 XID 的事务)。
  • 如果没有,检查是否有无效化消息。
  1. 检查无效化消息:
  • 如果有无效化消息,记录这些消息。
  • 如果没有,直接结束(不写入 XLOG)。
  1. 准备提交记录:
  • 记录逻辑解码相关的无效化信息。
  • 写入提交记录。
  1. 检查提交模式:
  • 如果是同步提交,刷新 XLOG 并更新 CLOG,等待同步复制完成。
  • 如果是异步提交,设置异步提交的 LSN,不立即刷新 XLOG。
  1. 清理和退出:
  • 释放分配的资源,结束函数执行。

以下是函数执行的流程图:

3. 源码解析

1. 初始化变量

TransactionId xid = GetTopTransactionIdIfAny();
bool markXidCommitted = TransactionIdIsValid(xid);
TransactionId latestXid = InvalidTransactionId;
int nrels = 0;
RelFileNode *rels = NULL;
int nchildren = 0;
TransactionId *children = NULL;
int ndroppedstats = 0;
xl_xact_stats_item *droppedstats = NULL;
int nmsgs = 0;
SharedInvalidationMessage *invalMessages = NULL;
bool RelcacheInitFileInval = false;
bool wrote_xlog = false;
  • xid:获取当前事务的事务 ID。
  • markXidCommitted:检查事务 ID 是否有效,用于后续判断是否需要记录提交。
  • latestXid:用于记录最新的事务 ID。
  • nrels、rels:用于存储需要删除的表文件信息。
  • nchildren、children:用于存储子事务的事务 ID。
  • ndroppedstats、droppedstats:用于存储统计信息的删除记录。
  • nmsgs、invalMessages:用于存储无效化消息。
  • RelcacheInitFileInval:标记是否需要无效化关系缓存初始化文件。
  • wrote_xlog:标记是否写入了 XLOG。

2. 记录逻辑解码的无效化信息

if (XLogLogicalInfoActive()) {
    LogLogicalInvalidations();
}
  • 如果逻辑解码功能启用,则记录逻辑解码相关的无效化信息。
3. 获取提交记录所需的数据
nrels = smgrGetPendingDeletes(true, &rels);
nchildren = xactGetCommittedChildren(&children);
ndroppedstats = pgstat_get_transactional_drops(true, &droppedstats);
if (XLogStandbyInfoActive()) {
    nmsgs = xactGetCommittedInvalidationMessages(&invalMessages,
                                                 &RelcacheInitFileInval);
}
  • smgrGetPendingDeletes:获取当前事务中待删除的表文件信息。
  • xactGetCommittedChildren:获取子事务的事务 ID。
  • pgstat_get_transactional_drops:获取统计信息的删除记录。
  • xactGetCommittedInvalidationMessages:获取无效化消息。

4. 检查是否写入了 XLOG

wrote_xlog = (XactLastRecEnd != 0);
  • 如果 XactLastRecEnd 不为 0,说明当前事务写入了 XLOG。

5. 检查是否需要记录提交

if (!markXidCommitted)
{
    if (nrels != 0 || ndroppedstats != 0) {
        elog(ERROR, "cannot commit a transaction that deleted files but has no xid");
    }
    Assert(nchildren == 0);

    if (nmsgs != 0) {
        LogStandbyInvalidations(nmsgs, invalMessages, RelcacheInitFileInval);
        wrote_xlog = true;
    }
    if (!wrote_xlog)
        goto cleanup;
}
  • 如果事务没有分配事务 ID(xid),则:
    • 确保没有待删除的表文件或统计信息。
    • 如果有无效化消息,则记录这些消息。
    • 如果没有写入 XLOG,则直接跳到清理阶段。

6. 记录提交 XLOG

else
{
    bool replorigin = (replorigin_session_origin != InvalidRepOriginId &&
                       replorigin_session_origin != DoNotReplicateId);

    BufmgrCommit();
    START_CRIT_SECTION();
    MyProc->delayChkptFlags |= DELAY_CHKPT_START;

    XactLogCommitRecord(xactStopTimestamp,
                        nchildren, children, nrels, rels,
                        ndroppedstats, droppedstats,
                        nmsgs, invalMessages,
                        RelcacheInitFileInval,
                        MyXactFlags,
                        InvalidTransactionId, NULL /* plain commit */ );

    if (replorigin) {
        replorigin_session_advance(replorigin_session_origin_lsn, XactLastRecEnd);
    }

    TransactionTreeSetCommitTsData(xid, nchildren, children,
                                   replorigin_session_origin_timestamp,
                                   replorigin_session_origin);
}
  • replorigin:检查是否启用了复制原点功能。
  • BufmgrCommit:通知缓冲区管理器准备提交。
  • START_CRIT_SECTION:进入提交的关键部分,防止并发的检查点操作干扰。
  • XactLogCommitRecord:记录提交的 XLOG 记录。
  • replorigin_session_advance:如果启用了复制原点功能,更新复制原点的 LSN。
  • TransactionTreeSetCommitTsData:设置提交时间戳数据。

7. 决定是否异步提交

if ((wrote_xlog && markXidCommitted &&
     synchronous_commit > SYNCHRONOUS_COMMIT_OFF) ||
    forceSyncCommit || nrels > 0)
{
    XLogFlush(XactLastRecEnd);
    if (markXidCommitted) {
        TransactionIdCommitTree(xid, nchildren, children);
    }
}
else
{
    XLogSetAsyncXactLSN(XactLastRecEnd);
    if (markXidCommitted) {
        TransactionIdAsyncCommitTree(xid, nchildren, children, XactLastRecEnd);
    }
}
  • 如果需要同步提交(synchronous_commit 配置为非关闭状态),或者事务有文件清理操作,则:
    • 强制刷新 XLOG。
    • 更新 CLOG(提交日志)。
  • 否则:
    • 设置异步提交的 XLOG LSN。
    • 异步更新 CLOG。

8. 离开提交关键部分

if (markXidCommitted)
{
    MyProc->delayChkptFlags &= ~DELAY_CHKPT_START;
    END_CRIT_SECTION();
}
  • 如果事务有有效的 xid,则离开提交关键部分,允许检查点继续。

9. 等待同步复制

if (wrote_xlog && markXidCommitted) {
    SyncRepWaitForLSN(XactLastRecEnd, true);
}
  • 如果事务写入了 XLOG 并且有有效的 xid,则等待同步复制完成。

10. 清理

cleanup:
if (rels) {
    pfree(rels);
}
if (ndroppedstats) {
    pfree(droppedstats);
}
  • 释放分配的资源。

11. 返回最新的事务 ID

latestXid = TransactionIdLatest(xid, nchildren, children);
return latestXid;
  • 计算并返回最新的事务 ID。

总结

RecordTransactionCommit 是一个复杂的函数,负责处理事务提交时的多种情况,包括:

  1. 记录提交的 XLOG。
  2. 更新 CLOG 和其他事务状态。
  3. 清理资源。
  4. 等待同步复制。
  5. 支持同步和异步提交。

这个函数是 PostgreSQL 事务提交机制的核心部分,确保事务的原子性和持久性。

海山数据库(He3DB)原理剖析:浅析OLAP数据库计算引擎中的统计信息 张步涛,中国移动云能力中心数据库产品部-OLAP数据库开发工程师。主要参与OLAP内核研发/湖仓一体研发相关工作。 阅读详情

相关推荐

海山数据库(He3DB)源码详解:主备复制start过程

在数据库主备复制(如PostgreSQL的流复制等场景)中,基础备份是建立主备数据库一致性的初始备份。它是一个数据库在某个时间点的完整副本,包含了数据库的数据文件、目录结构等所有用于恢复数据库到该时间点状态的必要信息。周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师。

yidongyun1111的博客 646

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

FSM文件是Free Space Map(空闲空间映射)的缩写,用于跟踪和记录数据块(Page)中的空闲空间。随着数据表不断进行插入、更新和删除元组等操作,数据页内必然会存在空页空间。在插入新的元组时,有两种方式可以选择:直接选择新的页来存放、存放到已有页的空闲空间中。

DAWN1221的博客 1233

VS配置RTKLIB(卫星定位开源代码)环境

@RTKlib代码调试教程-Visual Studio 2019 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ##RTKLIB-rtklib_2.4.3 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 @RTKlib代码调试教程-Visual Studio 2019 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技

qq_42209977的博客 4486

海山数据库(He3DB)源码详解:海山MySQL redo日志-日志文件组

MySQL的数据目录下默认有两个名为和的文件,log buffer中的日志默认情况下就是刷新到这两个磁盘文件中。redo从上边的描述中可以看到,磁盘上的redo日志文件不只一个,而是以一个日志文件组的形式出现的。这些文件以ib_logfile[数字](数字可以是0、1、2…)的形式进行命名。在将redo日志写入日志文件组时,是从ib_logfile0开始写,如果ib_logfile0写满了,就接着ib_logfile1写,同理,ib_logfile1写满了就去写ib_logfile2,依此类推。

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

别再怕无霍尔BLDC了!手把手教你用反电动势过零检测搞定电机换向(附STM32代码片段)

本文详细介绍了无霍尔传感器BLDC电机的驱动方法,重点讲解反电动势过零检测技术及其在STM32上的实现。通过硬件电路设计、信号调理和软件算法优化,手把手教你完成电机换向控制,并提供实用的调试技巧和代码片段,帮助开发者快速掌握无霍尔BLDC驱动技术。

weixin_42522575的博客 492

基于企业微信客服与GPT-3构建合规微信AI助手:从原理到部署实践

在人工智能与即时通讯融合的浪潮中,自然语言处理(NLP)与API集成成为构建智能对话系统的核心技术。其原理在于通过API网关接收用户输入,调用云端大语言模型进行处理,再将结果返回给用户,实现自动化交互。这项技术的核心价值在于将前沿AI能力无缝嵌入到日常高频应用场景中,极大地提升了客服自动化、智能问答与个性化服务的效率与体验。企业微信作为官方认可的企服平台,其开放的客服API接口为开发者提供了稳定、合规的消息通道,是连接微信生态与外部AI服务的理想桥梁。本文聚焦于如何利用企业微信客服API与OpenAI的GP

weixin_28727943的博客 627

海山数据库(He3DB)Redis技术实践:继承开源Redis精髓,强化升级企业级服务

数字化转型中的企业数据的处理速度和效率直接关系到企业的竞争力,Redis作为业界广泛使用的开源键值对存储系统,以其卓越的性能和丰富的数据结构,成为了众多开发者和企业的首选。

weixin_42744640的博客 2201

偷懒必备:3种方法快速移植MFC界面资源(含.rc文件打不开解决方案)

本文针对MFC桌面应用开发,详细介绍了三种快速移植界面资源的实战方法:直接编辑.rc文件、利用Visual Studio“添加现有项”进行可视化挂载,以及双实例拖拽应急方案。文章重点剖析了.rc文件无法打开的常见问题,提供了通过修复rc.exe等关键文件来根治此问题的解决方案,帮助开发者高效复用资源,规避ID冲突等陷阱。

weixin_28358083的博客 272

移动云海山数据库(He3DB)-数据仓库发展历史与架构演进

数据仓库从概念提出后随着用户使用需求的变化、新技术的出现等多种因素架构在不断演进,在这个过程中不同的厂商针对各自的观点和需求,例如原始数据(数据湖)、实时性、多模数据及机器学习等,不断的在进行架构优化和新技术的引入,针对数仓的概念也在不断的重新定义,下图对这些概念进行了总结:在图中数据库、数据仓库与数据湖是界限相对清晰的产品体系,但是随着技术的发展产品也在相互借鉴融合。数据仓库由于对数据实时性的需求演进到了实时数仓,在这个过程中数据的实时接入框架、查询性能的提升、交互式查询等能力让数仓的实现复杂化;

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

论文翻译:2024 High-Confidence Computing A survey on large language model (LLM) security and privacy: The

大型语言模型(LLMs),如ChatGPT和Bard,已经彻底改变了自然语言理解和生成。它们具有深度语言理解能力、类似人类的文本生成能力、上下文意识和强大的问题解决技能,使它们在各个领域(例如搜索引擎、客户支持、翻译)中变得不可或缺。同时,LLMs也在安全领域获得了关注,揭示了安全漏洞并展示了它们在安全相关任务中的潜力。本文探讨了LLMs与安全性和隐私的交集。具体来说,我们研究了LLMs如何积极影响安全性和隐私,与它们使用相关的潜在风险和威胁,以及LLMs内部的固有漏洞。

CSPhD-winston的博客 1722

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

【WorkBuddy专栏19】技能的创造与迁移——从零开始打造你的AI工作流

AI人人懂 369

海山数据库(He3DB)源码详解:海山MySQL undo日志

回滚(rollback):撤销对事务的操作,保证事务的原子性undo日志(undo log):记录回滚内容的文件。

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

24、虚拟地理信息系统:技术与应用的全面解析

本文全面解析了虚拟地理信息系统(虚拟GIS)的技术架构与应用前景。文章从地理空间数据的增长出发,探讨了虚拟GIS在地形、建筑、天气等多维度数据的交互式可视化技术,重点介绍了全球层次结构、多分辨率模型、缓存分页机制及交互导航方法。系统已应用于天气分析、城市规划、应急响应等领域,并展望了未来在数据处理、模拟操作、移动可视化及智能城市、文化遗产保护等方向的发展路径与技术挑战。

v4w5x6的博客 88

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

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

weixin_43544348的博客 1043

R语言生存分析之竞争风险模型

R语言生存分析之竞争风险模型 竞争风险模型(Competing Risk Model)是一种处理多种潜在结局生存数据的分析方法,早在1999年Fine和Gray就提出了部分分布的半参数比例风险模型,通常使用的终点指标是累积发生率函数(cumulative incidence function,CIF)。 研究中结局事件可能有多个,某些结局将阻止感兴趣事件的出现或影响其发生的概率,各结局事件形成“竞争”关系,互为竞争风险事件。 竞争风险模型( Competing Risk Model ) : 指

data+scenario+science+insight 5247

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HaishanDB(海山)|磐维数据库|YashanDB(崖山)深度对比分析

海山haishanDB基于PG深度自研,主打云原生、原生时序与AI原生一体化,适配政务云、工业互联网、智能体底座等增量赛道。移动体系内海山与磐维形成场景互补,错位发展。海山数据库的架构的天然适配,同时专业公司后续系统将全面上移动云,那么基于正云长出来的海山数据库(haishanDB),这是专业公司的最优选择。标杆案例 国家教育云、河钢工业云、多省医保影像云、政务云、移动MOMA大模型平台 全国各省移动BOSS、开通、计费、CRM通信核心系统 多家城商行/证券、三甲医院HIS、大型政务Oracle替换项目。

云计算、数据库爱好者 321

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深度解析大云海山数据库(He3DB)FileCache 机制

FileCache 作为 He3DB 数据库 的高性能二级缓存方案,通过 “本地缓存 + 智能淘汰 + 一致性保障”,有效突破了远程数据访问和磁盘 IO 的性能瓶颈。数据根据不同的访问规则,被标记为冷数据,热数据和温数据,存储在相应位置,当filecache 温数据层在实践中配置合理的大小,保证较高的命中率时,将会大大提高数据访问性能,在读多写少的场景中将会有较好的性能表现。

weixin_43544348的博客 1021

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

He3DB for PostgreSQL是受Aurora论文启发,基于开源数据库PostgreSQL 改造的数据库产品。架构上实现计算存储分离,并进一步支持数据的冷热分层,大幅提升产品的性价比。    He3DB for PostgreSQL中查询编译的主要任务是根据用户的查询语句生成数据库中最优执行计划,在此过程中要考虑视图、规则以及表的连接路径等问题。

He3DB_ht的博客 783

海山数据库(He3DB)源码详解:StartTransaction函数

本文介绍了事务提交过程中,具体执行提交任务的StartTransaction函数详细执行流程。

wukong3405的博客 1012

海山数据库(He3DB)原理剖析:浅析Doris跨源分析能力

张步涛,中国移动云能力中心数据库产品部-OLAP数据库开发工程师。主要参与OLAP内核优化/湖仓一体分析的研发。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 1165
上一篇: 海山数据库(He3DB)源码详解:MemoryContextData及MemoryContextMethods结构体解析
下一篇: 海山数据库(He3DB)源码详解:ResourceOwnerData及ResourceArray结构体解析
DAWN1221
博客等级 码龄7年 893粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值