1. 引言

根据 Vadim Mikheev 的说法,PostgreSQL 的多版本并发控制(MVCC)是一种“在多用户环境中提高数据库性能的高级技术”。该技术要求系统中存在同一数据元组的多个“版本”,这些版本由不同时间段内获取的快照进行管理。换句话说,在这种技术下,PostgreSQL 需要根据多个参数(如获取的快照、当前事务 ID 等)来判断哪些元组对用户是“可见”的,哪些是不可见的。这也被称为 PostgreSQL 的“可见性检查”规则。在本文中,我将讨论可见性检查的基本原理,帮助您了解 PostgreSQL 内部是如何执行这项任务的,希望这对您的开发工作有所帮助。

2. 涉及的参数

  • 元组本身,包含以下信息:
    • xmin(插入该元组的事务 ID)
    • xmax(如果大于 0,表示删除该元组的事务 ID;否则表示未被删除)
    • cid(命令 ID)
    • hintbit(提示位)
  • 全局顶级事务 ID(如果存在)
  • 当前快照,包含 xmin、xmax 和 cid
  • 提交日志数据(CLOG)

3. 检查过程

3.1 检查提示位(Hintbit)

可见性检查过程从检查提示位(hintbit)开始。如果提示位的状态为“已提交”(COMMITTED),则可以跳过大部分其他可见性检查规则以提高效率。对于已提交的元组,PostgreSQL 会获取该元组的 xmin 值,并与当前快照进行比较,以确保该元组当前未处于“进行中”(in progress)状态(参见 3.3 节中的公式以确定“进行中”状态)。这一检查是必要的,因为即使元组已提交,仍有可能被其他后台进程在此时更新。如果元组未被其他后台进程“进行中”,则最后会检查其 xmax 值以确保它是无效的(即未被删除)。当上述条件都满足时,该元组被认为是对用户可见的。

如果提示位显示“已中止”(ABORTED),则该元组对用户不可见。如果提示位没有值,则 PostgreSQL 会继续执行后续的可见性检查规则。

3.2 检查元组的 xmin 是否等于全局顶级事务 ID

下一个检查步骤是将元组的 xmin 与全局顶级事务 ID 进行比较,看它们是否相等。全局顶级事务 ID 仅在用户通过 BEGIN 语句手动启动事务时才会被设置。如果用户未以这种方式启动事务(即未发出 BEGIN 语句),则全局顶级事务 ID 不会被设置,因此此检查将被跳过。

如果元组的 xmin 等于全局顶级事务 ID,则意味着该元组当前由当前后台进程(而非其他进程)“进行中”。此时,命令 ID(cid)将用于确定可见性。在事务块中,发出的每个命令都有一个关联的命令 ID,用于指示命令的先后顺序。例如,如果在一个事务中,SELECT 命令在 UPDATE 命令之后,那么 SELECT 必须看到由之前的 UPDATE 命令更新的新元组,cid 在这一确定中起作用。这种行为还受“隔离级别”(isolation level)的影响,但隔离级别不在本文讨论范围内。默认的隔离级别是“读已提交”(READ COMMITTED),这使得 SELECT 能看到由之前的 UPDATE 更改的数据;但如果隔离级别设置为“可重复读”(REPEATABLE READ),则 SELECT 不会看到由之前的 UPDATE 更改的数据。请牢记这一点。

如果元组的 xmin 不等于全局顶级事务 ID,则 PostgreSQL 会继续执行后续的可见性检查规则。

3.3 检查当前快照

下一个检查步骤是 PostgreSQL 检查该元组是否被其他后台进程“进行中”。这是通过将元组的 xmin 值与当前快照的 xmin 和 xmax 值进行比较来完成的,公式如下:

  • 元组 xmin < 快照 xmin:表示未进行中
  • 元组 xmin >= 快照 xmax:表示进行中

如果根据快照判断该元组为“进行中”,则该元组对当前用户不可见,因为其他后台进程仍在处理它。如果元组未被认为“进行中”,则 PostgreSQL 会继续执行后续的可见性检查规则。

3.4 检查提交日志(CLOG)

下一个检查步骤是 PostgreSQL 获取元组的 xmin 值,并对照提交日志(CLOG)检查该元组是否已提交或中止。CLOG 类似于一个事务 ID 数组,每个数组元素存储一个提交状态。PostgreSQL 使用公式将事务 ID 转换为 CLOG 块加上偏移量,以精确访问正确的 CLOG 元素。CLOG 数据结构会通过检查点(checkpoint)进程定期刷新到磁盘,存储在以下三个目录中:pg_xactpg_multixactpg_subtrans

如果 CLOG 显示该元组已提交,PostgreSQL 会继续检查元组的 xmax 值以确保它是无效的(即未被删除)。如果 xmax 无效,则该元组对用户可见。同时,PostgreSQL 会将该元组的提示位更新为“已提交”(COMMITTED),以便在下次可见性检查时无需再次访问 CLOG,因为访问 CLOG 的成本较高。

如果 CLOG 显示该元组已中止或无效,则该元组对当前用户不可见。同时,PostgreSQL 会将该元组的提示位更新为“无效”(INVALID)。

4. 总结

以上是我对 PostgreSQL 中基本可见性规则的理解。当然,还有其他复杂的检查未在此提及,例如子事务和多事务的处理,但它们的模式与本文提到的内容有些相似。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919878.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919878.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919878.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普通烘箱 vs 铠德科技防静电烘箱:深度对比与选择指南

在电子制造、化工、航空航天等精密工业领域&#xff0c;烘箱作为关键工艺设备&#xff0c;其性能直接关系到产品可靠性和生产安全。普通烘箱与防静电烘箱的核心差异在于静电防护能力&#xff0c;而铠德科技作为防静电烘箱领域的专业厂商&#xff0c;其产品通过技术创新重新定义…

达梦数据库巡检常用SQL(一)

达梦数据库巡检常用SQL(一) 数据库基本信息 数据库用户信息 数据库对象检查 数据库基本信息 检查授权信息: SELECT /*+DMDB_CHECK_FLAG*/ LIC_VERSION AS "许可证版本" ,SERIES_NO AS "序列号" ,CHECK_CODE AS "校验码" …

TypeScript的接口 (Interfaces)讲解

把接口&#xff08;Interface&#xff09;想成一份“说明书”或“合同书”。说明书 比如电饭煲的说明书告诉你&#xff1a; 必须有“煮饭”按钮必须有“保温”功能颜色可以是白、黑、红 接口在 TypeScript 里干的就是同样的事&#xff1a;它规定一个对象“长什么样”。 interfa…

Python本源诗话(我DeepSeek)

物理折行新注释&#xff0c;直抒胸臆吾志名。 笔记模板由python脚本于2025-08-23 13:14:28创建&#xff0c;本篇笔记适合喜欢python和诗的coder翻阅。 学习的细节是欢悦的历程 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 Python官网…

博士招生 | 美国圣地亚哥州立大学 Yifan Zhang 课题组博士招生,AI 安全领域顶尖平台等你加入!

内容源自“图灵学术博研社”gongzhonghao学校简介圣地亚哥州立大学&#xff08;San Diego State University, SDSU&#xff09;是美国加州南部久负盛名的公立研究型大学。学校坐落于科技产业高度活跃的南加州地区&#xff0c;与本地软件、电信、生物科技、国防及清洁能源等领域…

Day22: Python涡轮增压计划:用C扩展榨干最后一丝性能!

目录&#x1f525; 第一章&#xff1a;初识外挂 - ctypes初体验1.1 C语言涡轮引擎1.2 Python调用秘籍⚡ 第二章&#xff1a;Cython核弹级加速2.1 给Python穿上防弹衣2.2 编译倒计时2.3 起飞测试&#x1f3ce;️ 第三章&#xff1a;终极速度对决3.1 赛前准备3.2 比赛结果&#x…

如何修复“DNS服务器未响应”错误

“DNS服务器未响应”是一种常见的网络错误&#xff0c;当设备无法与域名系统&#xff08;DNS&#xff09;服务器通信以将域名转换为IP地址时&#xff0c;就会出现这种错误。DNS服务器的作用是将域名转换为IP地址&#xff08;例如&#xff0c;将www.example.com转换为192.168.1.…

数据结构与算法-算法-三数之和

题目&#xff1a; 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09;15. 三数之和 - 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所…

ASCOMP PDF Conversa:高效精准的PDF转换工具

在日常工作和学习中&#xff0c;PDF文件因其格式稳定、兼容性强而被广泛使用。然而&#xff0c;PDF文件的编辑性较差&#xff0c;常常需要将其转换为可编辑的格式&#xff0c;如Word文档。ASCOMP PDF Conversa作为一款功能强大的PDF转换工具&#xff0c;能够将PDF文件转换成可编…

JAVA核心基础篇-集合

想要了解集合&#xff0c;首先要知道一个东西&#xff0c;叫数据结构。所谓数据结构&#xff0c;其实就是计算机存储&#xff0c;组织数据的方式。常用的数据结构有8大类数组&#xff0c;链表&#xff0c;树&#xff0c;堆&#xff0c;栈&#xff0c;队列&#xff0c;哈希表&am…

大模型——深度评测智能体平台Coze Studio

深度评测智能体平台Coze Studio 7 月底字节跳动的 Coze-Studio 正式开源,算是 AI 智能体领域的一个大事件。这个月终于有时间在内网环境进行了部署和评测,希望能为团队的企业知识库和 AI 应用建设提供多一个选项。 其实,我们厂的知识库系统一直是自研的。没有直接采用市面…

UE5打包,LoadObject加载不出网格|动画

由于笔者UE5加载模型和动画使用的动态加载&#xff08;LoadObject&#xff09;&#xff0c;而这些资源&#xff08;XX001、XX002 等&#xff09;没有被任何关卡或蓝图直接引用&#xff0c;在编辑器状态下是可以正常加载的&#xff0c;但它们在打包时被当作“无用”资源而排除了…

C 语言标准输入输出头文件stdio.h及其常见用法

在这篇文章中&#xff0c;我们来详细聊一聊 C 语言标准输入输出头文件 stdio.h 及其常见用法。1. stdio.h 是什么 stdio.h&#xff08;Standard Input and Output Header&#xff09;是 C 标准库中的一个头文件&#xff0c;提供了处理标准输入输出和一些文件操作的函数声明。 它…

Js逆向 拼夕夕anti_content

前言 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;本文章未经…

大模型时代为什么需要向量数据库?

这里写自定义目录标题1. 向量数据库2. 向量嵌入3. 特征和向量4. 相似性测量4.1 欧几里得距离4.2 余弦相似度5. 相似性搜索5.1 K-Means5.2 基于文本嵌入进行意图匹配6. 问答助手7. 意图匹配1. 向量数据库 向量数据库&#xff08;Vector Database&#xff09;&#xff0c;也叫矢…

【Canvas与旗帜】二十角金盘德国旗

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>多角金盘德国旗 Draft1</title><style type"text/css&qu…

Linux软件编程:总结

一、Linux系统概述&#xff08;一&#xff09;Linux系统概述&#xff08;二&#xff09;Linux系统简介1.常见的Linux系统&#xff1f;2.Linux操作系统是操作系统的核心&#xff0c;也成为内核&#xff0c;内核的主要功能&#xff1f;3.shell是操作系统的外壳&#xff0c;主要作…

【51单片机学习】直流电机驱动(PWM)、AD/DA、红外遥控(外部中断)

一、直流电机驱动&#xff08;PWM&#xff09;1.直流电机介绍步进电机的旋转速度完全由编码的通电时间决定的&#xff0c;可以用于精密控制。 舵机内部是一个直流电机加一个控制器&#xff0c;引出三根线&#xff0c;分别是正负极和编码线&#xff0c;根据输出电平的时间来控制…

ComfyUI Portrait Master肖像大师中文版

本文转载自&#xff1a;ComfyUI Portrait Master肖像大师中文版 - Hello123工具导航 ** 一、产品定位与技术架构 肖像大师中文版是专为 AI 绘画工具设计的提示词生成插件&#xff0c;通过结构化参数控制实现精准人物肖像生成。它基于 ComfyUI 平台开发&#xff0c;提供 193 国…

(Redis)内存淘汰策略

1. 为什么需要内存淘汰策略&#xff1f;Redis 是一个基于内存的高性能数据库&#xff0c;所有数据都存储在内存中。优点&#xff1a;读写速度极快。缺点&#xff1a;内存有限&#xff0c;存满之后如果继续写入&#xff0c;就必须有一套策略来决定“删掉谁&#xff0c;留下谁”。…