PostgreSQL技术内幕11:PostgreSQL事务原理解析-MVCC
文章目录
- 0.简介
- 1.MVCC介绍
- 2.MVCC常见的实现方式
- 3.PG的MVCC实现
- 3.1 可见性判断
- 3.2 提交/取消
0.简介
本文主要介绍在事务模块中MVCC(多版本并发控制)常见的实现方式,优缺点以及PG事务模块中MVCC(多版本并发控制)的实现。
1.MVCC介绍
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库管理系统中的并发控制的方法。在传统的并发控制中,常用的简单方式是通过加锁来保证某一时刻数据只被一个事务修改,但这种方式可能会带来并发度的下降,尤其在高并发场景下,很可能导致性能瓶颈。MVCC主要通过维护数据的多个版本来解决传统锁机制的一些局限性,每个事务可以看到一个特定版本,从而使得读写操作可以互不干扰地执行,其核心在于,对于每个修改,不直接在原始数据上修改,而是创建一个新的数据版本来做修改,其他事务依然可以访问旧的数据,以此来提高并发度。当然MVCC也有其局限性,比如在高并发场景下可能因为多个版本导致占用较高内存。
2.MVCC常见的实现方式
MVCC常见的实现方式有两种:
1)修改旧数据前备份,在写新的数据时,把旧的数据备份到单独的一块空间,其他事务读取数据时,可以在备份空间中获取,比如MySQL innodb引擎的回滚段。
2)新数据不直接修改,而是采用插入的方式。
以上两种方式,功能上都能实现MVCC,都需要占用一定的空间,两者相比较,二的事务回滚更为方便,不会出现备份空间用尽的问题;一的话清理上会更为简单,不会导致数据扫描使得读数据增加。PG采用的是二,即采用插入方式实现的MVCC。
3.PG的MVCC实现
3.1 可见性判断
MVCC的实现,首先要有版本的概念,下面来看PG中的定义,然后以一个实际的例子来分析可见性的判断,定义如下:
typedef struct HeapTupleFields
{TransactionId t_xmin; /* inserting xact ID */TransactionId t_xmax; /* deleting or locking xact ID */union{CommandId t_cid; /* inserting or deleting command ID, or both */TransactionId t_xvac; /* old-style VACUUM FULL xact ID */} t_field3;
} HeapTupleFields;struct HeapTupleHeaderData
{union{HeapTupleFields t_heap;DatumTupleFields t_datum;} t_choice;ItemPointerData t_ctid; /* current TID of this or newer tuple (or a* speculative insertion token) */....
}
可以看到,在上面代码结构中,每个元组头部存储事务的t_xmin(数据插入的事务id),t_xmax(数据删除或更新的事务id)如果为0则表示还未被删除和更新,这两个值一旦被设计就不会再次变化。
下面通过一个例子来看一个更新操作的修改以及可见性的判断。

上述描述了向当前表插入了一条数据的过程,初始a=2,b=2的记录是由事务id为10的事务插入,xmax为0即还没被删除或更新;然后执行update语句,将a的值设置为6,xmax的值更新为11(表示由id为11的事务删除),同时新增一条记录(不在原记录修改),此时虽然有两条数据,但其实应该只有一条,所以需要根据事务的快照和提交的记录来进行判断,也就是可见性的判断。
在PG中,是用snapshot来获取那些事务正在执行,通过snapshot来区分事务是正在执行还是已经完成了,如果事务尚未完成,那么事务的更新和写入对其他事务来说是不可见的。snapshot数据结构如下:
typedef struct SnapshotData
{SnapshotSatisfiesFunc satisfies; /* tuple test function */TransactionId xmin; /* all XID < xmin are visible to me */TransactionId xmax; /* all XID >= xmax are invisible to me */TransactionId *xip;uint32 xcnt; /* # of xact ids in xip[] */TransactionId *subxip;int32 subxcnt; /* # of xact ids in subxip[] */bool suboverflowed; /* has the subxip array overflowed? */bool takenDuringRecovery; /* recovery-shaped snapshot? */bool copied; /* false if it's a static snapshot */CommandId curcid; /* in my xact, CID < curcid are visible */uint32 speculativeToken;uint32 active_count; /* refcount on ActiveSnapshot stack */uint32 regd_count; /* refcount on RegisteredSnapshots */pairingheap_node ph_node; /* link in the RegisteredSnapshots heap */TimestampTz whenTaken; /* timestamp when snapshot was taken */XLogRecPtr lsn; /* position in the WAL stream when taken */
} SnapshotData;
其中所有XID<xmin(已完成的)的事务都可见,所有XID>xmax的事务都不可见,而介于xmin和xmax之间的事务可能已完成也可能进行中,所以需要一个数组来存储(xip),如果在xmin和xmax之间的事务id在这个数组被发现,说明事务正在进行且尚未完成,不可见。
获取数据时,会先根据snapshot来判断事务是否已完成,如果未完成,则不可见,对于已完成的需要判断时提交还是取消,查询clog来进行判断。这里还有个性能优化,就是使用tuple中标志位来进行判断,减少clog查询。
3.2 提交/取消
在PG中,一个事务最终状态可能有两种:Commit/Abort。
1)Commit:提交时会写WAL和CLOG,提交后对于其他事务可见。
2)Abort: abort时会写WAL和CLOG,abort后对于其他事务不可见。
相关文章:
PostgreSQL技术内幕11:PostgreSQL事务原理解析-MVCC
文章目录 0.简介1.MVCC介绍2.MVCC常见的实现方式3.PG的MVCC实现3.1 可见性判断3.2 提交/取消 0.简介 本文主要介绍在事务模块中MVCC(多版本并发控制)常见的实现方式,优缺点以及PG事务模块中MVCC(多版本并发控制)的实现。 1.MVCC…...
Java-面向对象编程(基础部分)
类和对象的区别和联系 类:类是封装对象的属性和行为的载体,在Java语言中对象的属性以成员变量的形式存在,而对象的方法以成员方法的形式存在。 对象:Java是面向对象的程序设计语言,对象是由类抽象出来的,…...
SMS over IP原理
目录 1. 短消息业务的实现方式 2. 传统 CS 短消息业务中的发送与送达报告 3. MAP/CAP 信令常见消息 4. SMS over IP 特点概述 5. SMS over IP 中的主要流程 5.1 短消息注册流程(NR 或 LTE 接入) 5.2 短消息发送(MO)流程(NR 或 LTE 接入) 5.3 短消息接收(MT)流程(NR 或…...
Linux中使用Docker容器构建Tomcat容器完整教程
🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…...
【机器学习】7 ——k近邻算法
机器学习7——k近邻 输入:实例的特征向量 输出:类别 懒惰学习(lazy learning)的代表算法 文章目录 机器学习7——k近邻1.k近邻2.模型——距离,k,分类规则2.1距离——相似程度的反映2.2 k值分类规则 算法实…...
2024.09.09 校招 实习 内推 面经
🛰️ :neituijunsir 交* 流*裙 ,内推/实习/校招汇总表格 1、校招 | 佑驾创新 MINIEYE 2025校园招聘正式启动(内推) 校招 | 佑驾创新 MINIEYE 2025校园招聘正式启动(内推) 2、校招 | 长安汽…...
浅谈Linux中的环回设备
什么是环回设备 环回设备(loop device) 是 Linux 系统中一种特殊的虚拟设备,它允许你将一个普通的文件当作块设备来操作。这意味着,借助环回设备,文件可以模拟为一个磁盘或分区,供系统读写。这种机制非常有…...
聚焦汽车智能化与电动化,亚洲领先的汽车工业技术博览会 2025年11月与您相约 AUTO TECH 华南展
抢占市场先机︱聚焦汽车智能化与电动化,亚洲领先的汽车工业技术博览会 2025年11月与您相约 AUTO TECH 华南展 随着汽车智能化与电动化的迅猛发展,汽车电子技术、车用功率半导体技术、智能座舱技术、轻量化技术/材料、软件定义汽车、EV/HV技术、测试测量技…...
(史上最全)线程池
线程池 文章目录 线程池一,前言二,线程池三,参数四,线程池的实现原理5.线程池的使用案例(自定义线程池)6.使用Executors 创建常见的功能线程池1.固定大小线程池2.定时线程3.可缓存线程池4.单线程化线程池 一,前言 虽然…...
【ShuQiHere】 支持向量机(SVM)详解:从理论到实践,这一篇就够了
📖 【ShuQiHere】 在现代机器学习课程中,支持向量机(SVM) 是不可或缺的一部分。它不仅在分类任务中有出色表现,还能灵活处理回归问题。尽管看似复杂,SVM 背后的思想却深刻而优雅。今天我们将全面探讨**支持…...
log4j2线程级动态日志级别
详见 参考 着重说明: DynamicThresholdFilter: 配置长这样:配置解释链接 <DynamicThresholdFilter key"logLevel" defaultThreshold"ERROR" onMatch"ACCEPT" onMismatch"DENY"><KeyVa…...
百度Android IM SDK组件能力建设及应用
作者 | 星途 导读 移动互联网时代,随着社交媒体、移动支付、线上购物等行业的快速发展,对即时通讯功能的需求不断增加。对于各APP而言,接入IM SDK(即时通讯软件开发工具包)能够大大降低开发成本、提高开发效率&#…...
CSS-Grid布局详解
前言 Grid 栅格布局 是 CSS 语言中非常强大的种布局,它提供了丰富的工具属性,可以轻松实现复杂且灵活的布局设计,因此想要完美使用CSS Grid 也有一定的难度和复杂性,我自己也是花了不少时间才真正掌握它的使用,在这篇…...
Give azure openai an encyclopedia of information
题意:给 Azure OpenAI 提供一部百科全书式的信息 问题背景: I am currently dabbling in the Azure OpenAI service. I want to take the default model and knowledge base and now add on to it my own unique information. So, for example, for mak…...
Nginx越界读取缓存漏洞(CVE-2017-7529)
漏洞原理: 影响版本内默认配置模块的Nginx只需要开启缓存,攻击者可以通过发送包含恶意构造range域的header请求进行远程攻击造成信息泄露。 影响范围: Nginx 0.5.6 – 1.13.2 漏洞复现: 开启靶场,访问8080端口 中间…...
【MySQL】查询语句之inner、left、right、full join 的区别
前言: INNER JOIN 和 OUTER JOIN 是SQL中常用的两种连接方式,用于从两表活多表中提取相关的数据。两者区别主要在于返回的 结果集 如何处理 匹配 与 不匹配 的行。 目录 1、INNER JOIN 2、OUTER JOIN 3、总结 1、INNER JOIN 称为内连接,只…...
Submariner 部署全过程
Submariner 部署全过程 部署集群配置 broker 集群: pod-cidr:11.244.0.0/16 service-cidr 11.96.0.0/12 broker 172.100.0.109 node 172.100.0.108 集群 1( pve3 ): pod-cidr:10.244.0.0/16 service-…...
驼峰命名法
一、驼峰命名法简介 驼峰命名法(Camel Case)是一种在编程和人类语言中广泛使用的书写方式,通过将单词连接在一起,并使每个单词的首字母大写来表示复合词或短语。这种命名法有小驼峰法和大驼峰法两种变种。 二、小驼峰命名法&…...
Android IME输入法启动显示隐藏流程梳理
阅读Android AOSP 12版本代码,对输入法IME整体框架模块进行学习梳理,内容包含输入法框架三部分IMM、IMMS、IMS的启动流程、点击弹出流程、显示/隐藏流程,以及常见问题和调试技巧。 1. IME整体框架 IME整体分为三个部分…...
Java 入门指南:JVM(Java虚拟机)——类的生命周期与加载过程
文章目录 类的生命周期类加载过程1)载入(Loading)2)验证(Verification)文件格式验证符号引用验证 3)准备(Preparation)4)解析(Resolution…...
Display Driver Uninstaller(DDU):显卡驱动深度清理工具,解决游戏玩家与设计师的驱动残留难题
Display Driver Uninstaller(DDU):显卡驱动深度清理工具,解决游戏玩家与设计师的驱动残留难题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项…...
Nunchaku-flux-1-dev参数详解:CFG Scale、种子数等关键参数实战影响
Nunchaku-flux-1-dev参数详解:CFG Scale、种子数等关键参数实战影响 你是不是也遇到过这样的情况:用同一个模型,别人生成的图片细节满满、创意十足,而你生成的却总是差点意思,要么太放飞自我,要么又过于死…...
Buck电路设计避坑指南:为什么你的小信号模型仿真总是不收敛?
Buck电路小信号模型仿真收敛问题实战解析 在电力电子系统设计中,Buck变换器的小信号模型仿真对于理解系统动态特性至关重要。然而,许多工程师在从理论转向实践时,常常遇到仿真不收敛、波形异常等问题。本文将深入剖析这些问题的根源ÿ…...
忍者像素绘卷微信小程序接入:用户提示词历史+生成图云存储方案
忍者像素绘卷微信小程序接入:用户提示词历史生成图云存储方案 1. 项目背景与核心价值 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,将16-Bit复古游戏美学与现代AI图像生成技术完美结合。这款工具特别适合创作具有忍者主题和复古像素…...
STM32F407实战:基于CubeMX与FreeRTOS的SDIO-FatFs文件系统高效读写方案
1. 环境准备与CubeMX基础配置 第一次接触STM32F407的SD卡存储时,我被各种专业术语搞得晕头转向。后来发现,只要用对工具和方法,实现文件系统读写其实没那么复杂。CubeMX这个图形化配置工具真是开发者的福音,它能帮我们自动生成80%…...
3个关键场景与4步操作:深入解析RevokeMsgPatcher防撤回工具的技术实现与应用实践
3个关键场景与4步操作:深入解析RevokeMsgPatcher防撤回工具的技术实现与应用实践 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目…...
Qwen3.5-2B图文理解评测:在TextVQA、ChartQA等基准测试中的轻量级SOTA表现
Qwen3.5-2B图文理解评测:在TextVQA、ChartQA等基准测试中的轻量级SOTA表现 1. 模型概览 Qwen3.5-2B是Qwen3.5系列中的轻量化多模态基础模型,仅有20亿参数规模,却展现出超越参数量的强大图文理解能力。该模型专为低功耗、低门槛部署场景设计…...
终极PDF Arranger常见问题FAQ:解决用户最关心的30个疑问
终极PDF Arranger常见问题FAQ:解决用户最关心的30个疑问 【免费下载链接】pdfarranger Small python-gtk application, which helps the user to merge or split PDF documents and rotate, crop and rearrange their pages using an interactive and intuitive gra…...
Winhance:重塑Windows体验的系统优化与个性化解决方案
Winhance:重塑Windows体验的系统优化与个性化解决方案 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. PowerShell GUI application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi…...
宇树一年赚6亿背后:研发投入不足1亿,7成人形机器人卖给高校
文章目录前言一、这不是科技公司,这是"高校特供"的硬体印钞机二、七成卖给高校:科研界的"乐高积木"三、研发费用不到1亿:极致省钱的"小脑"路线四、42亿募资背后的焦虑:要补"大脑"短板了五…...
