百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

了解 PostgreSQL 的 MVCC 可见性基本检查规则

itomcoil 2025-09-03 00:06 3 浏览

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_xact、pg_multixact 和 pg_subtrans。

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

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

4. 总结

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

相关推荐

Postgres是个六边形战士,其他很多工具是没必要的

你只是想部署一个简单应用,一个仪表盘、一个聊天工具,或者个人项目。突然之间,你得启动Redis做缓存,上Elasticsearch做搜索,用Firebase实现实时同步,配置无服务器函数的...

PostgreSQL开发与实战(5)备份管理pg_probackup

作者:太阳一、pg_probackup概述pg_probackup是一款免费的postgres数据库集群备份工具,与其他备份工具相比,它主要有如下一些优势:提供增量备份,增量备份一定程度上可以节省磁...

了解 PostgreSQL 的 MVCC 可见性基本检查规则

1.引言根据VadimMikheev的说法,PostgreSQL的多版本并发控制(MVCC)是一种“在多用户环境中提高数据库性能的高级技术”。该技术要求系统中存在同一数据元组的多个“版本”,...

PostgreSQL初学者需要知道一些技巧

PostgreSQL作为一个优雅而且稳健的数据库越来越被大家所采纳,除了Mysql以外很多人都开始接触并学习PostgreSQL。但是PostgreSQL和传统的一些数据库系统还有有点点小小的鸿沟,有...

Python - 操作 PostgreSQL 数据库的基本方法与代码

本文记录在Python编程中操作PostgreSQL数据库的基本方法与实现代码,包括连接数据库、创建数据表、插入/更新/删除数据表中的记录、函数调用、存储过程调用及事务处理等。获取数据库首先把连接数据...

详解PostgreSQL 12.2时间点恢复 (PITR)

概述PostgreSQL提供了不同的方法来备份和恢复数据库,可以是某一时刻数据库快照的完整备份或增量备份,可以使用SQL转储或文件系统级别的备份,在增量备份的基础上还可以实现基于时间点恢复。这...

PostgreSQL 17即将发布,新功能Top 3

按照计划,PostgreSQL17即将在2024年9月份发布,目前已经发布了第三个Beta版本,新版本的功能增强可以参考ReleaseNotes。本文给大家分享其中3个重大的新...

PostgreSQL从入门到精通教程 - 第39讲:数据库完全恢复

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注...

PostgreSQL建库说明_postgresql能创建多少表

1.数据库逻辑结构介绍在一个PostgreSQL数据库系统中,数据库:一个PostgreSQL数据库服务下可以管理多个数据库,当应用连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他...

为什么delete后磁盘空间没有释放而truncate会释放?

背景因项目需求,需要清理一批旧数据,腾出空间给新数据,让同事负责这件事。料想会很顺利,但很快找到我,并告知在postgresql中把一张大的数据表删除掉了,查询表的size并没有改变。我震惊了,问他怎...

PostgreSQL技术内幕6:PostgreSQL索引技术

0.简介本文主要介绍PG的索引技术,包含PG支持的索引类型,语法,查看方式,以及其中B-Tree索引的原理解析和源码解读。1.PG索引类型介绍PG支持多种索引类型:B-tree、Hash、GiST、...

PostGreSQL历史_postgresql序列查询

1973UniversityINGRES(起源于IBMSystemR的一系列文档,MichaelStonebrakerandEugeneWong)1982INGRES1985...

Retool 如何升级主应用 4TB 的 PostgreSQL 数据库

本文最初发布于Retool官方博客。Retool的云托管产品基于一个在微软Azure云中运行的4TB的Postgres数据库。去年秋天,我们把这个数据库从Postgres9.6...

ArcGIS Desktop直连PostgreSQL安装及配置图解(windows)

目录1PostgreSQL11.0安装及配置2psqlODBC安装及配置3PostGIS安装及配置4pgAdmin4使用入门5空间数据导入5.1将PostgreSQL的bin文件路径添加...

基于patroni+etcd打造可自动故障转移的PostgreSQL集群

作者:杭州美创科技有限公司得益于PostgreSQL的开源特性,越来越多的第三方集群管理软件填补了PostgreSQL在集群方面的易用性和可靠性,patroni+etcd提供了一系列的集群管理方案。e...