0

0

postgresql元组可见性如何判断_postgresqlmvcc可见性规则

舞姬之光

舞姬之光

发布时间:2025-11-22 01:53:18

|

619人浏览过

|

来源于php中文网

原创

元组可见性由t_xmin、t_xmax与事务快照共同决定,需满足插入事务可见且删除事务不可见;通过hint bits、VM和freeze机制优化判断效率并防止回卷问题。

postgresql元组可见性如何判断_postgresqlmvcc可见性规则

PostgreSQL 使用 MVCC(多版本并发控制)机制来管理数据的并发访问,确保事务之间互不干扰的同时提供一致的数据视图。元组可见性是 MVCC 的核心概念之一,决定了某个事务是否能看到某一行数据(即元组)。判断一个元组是否对当前事务可见,依赖于元组的系统字段和当前事务的状态。

元组可见性依赖的关键系统字段

每个元组包含以下四个关键的系统字段,用于判断其可见性:

  • t_xmin:插入该元组的事务 ID
  • t_xmax:删除或更新该元组的事务 ID
  • t_ctid:指向元组的物理位置,用于链式更新追踪
  • t_infomask:包含事务提交状态、命令号等元信息(内部使用)

PostgreSQL 判断元组是否可见时,结合当前事务的快照(Transaction Snapshot)进行评估。事务快照记录了在事务开始时所有正在运行的事务列表,以及 xmin 和 xmax 范围。

基本可见性规则

对于当前事务来说,判断一个元组是否可见,遵循以下逻辑:

1. 如果 t_xmin > 当前事务的快照 xmin

说明插入该元组的事务是在当前事务开始之后才启动的,因此该元组对当前事务不可见。

2. 如果 t_xmin 是未提交事务且不在快照的活跃事务列表中,并且已提交

需要检查该事务最终是否提交。如果已提交,则可能可见(还需进一步判断);如果被回滚,则该元组无效。

3. 如果 t_xmax 为 0

表示该元组未被删除或更新,只要 t_xmin 可见,该元组就可见。

4. 如果 t_xmax 非 0
  • 若 t_xmax 对应的事务已提交,则该元组已被删除或被新版本取代,对当前事务不可见
  • 若 t_xmax 对应的事务未提交或在快照中仍为活跃事务,则该元组仍可能可见
5. 更新操作的处理

UPDATE 操作会标记旧元组的 t_xmax 为当前事务 ID,并插入一个新元组(t_xmin 为当前事务 ID)。新元组是否可见,按上述规则判断。旧元组即使被“删除”,只要其 t_xmax 未提交,在某些事务中仍可见。

事务快照的作用

事务启动时,PostgreSQL 会生成一个快照(SnapshotData),包含:

Moonbeam
Moonbeam

经过专业培训的 AI 写作助手,可帮助您撰写各类长篇内容。

下载
  • xmin:当前系统中最老的尚未结束的事务 ID(即还在运行的最小事务 ID)
  • xmax:下一个将要分配的事务 ID
  • xip_list:在事务开始时仍在运行的事务 ID 列表

判断可见性的标准流程:

  • 若 t_xmin
  • 若 t_xmax ≠ 0:
    • 若 t_xmax
    • 若 t_xmax 在 xip_list 中 → 删除者仍在运行 → 元组仍可见

简而言之:一个元组只有在其插入事务对当前事务“可见”且删除事务对当前事务“不可见”或未发生时,才是可见的。

特殊情况与优化

为了提升可见性判断效率,PostgreSQL 引入了以下机制:

Hint Bits

在元组头中设置 hint bits,标记事务是否已提交或回滚,避免每次都要查询事务状态日志(clog)。

Visibility Map (VM)

标识哪些数据页中的所有元组都对所有事务可见,可用于 VACUUM 跳过清理,也支持 index-only scans。

Freeze 和事务ID回卷处理

为防止事务 ID 回卷造成可见性混乱,PostgreSQL 使用 VACUUM FREEZE 将很老的事务标记为“冻结事务”,视为永远已提交。

基本上就这些。理解元组可见性有助于排查“幻读”现象、分析长事务影响,以及优化 vacuum 策略。掌握 xmin、xmax 与事务快照的关系,是深入理解 PostgreSQL 并发控制的基础。

相关专题

更多
golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

60

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.27

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

158

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

978

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

197

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

269

2023.11.20

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 13.2万人学习

C# 教程
C# 教程

共94课时 | 7.4万人学习

SQL 教程
SQL 教程

共61课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号