PG-多版本并发控制

news/2024/7/9 22:16:58 标签: postgresql

多版本并发控制(Multi-Version Concurrency Control,MVCC),是数据库中并发访问数据时保证数据一致性的一种方法

1. 原理

1)  在并发操作中,当正在写时,如果有用户在读,这时写可能只写了一半,如一行的前半部分刚写入,后半部分还没有写入,这时可能读的用户读取到的数据行的前半部分数据是新的,后半部分数据是原来的,这就导致了数据一致性问题。解决这个问题的最简单的方法是使用读写锁,写的时候不允许读,正在读的时候也不允写,但这种方法会导致读和写的操作不能并发执行。于是,有人想到了一种能够让读写并发执行的方法,这种方法就是MVCC。MVCC方法是写数据时,原数据并不删除,并发的读还能读到原数据,这样就不会有数据一致性问题了。

2)  实现MVCC的方法有以下两种。
·第一种:写新数据时,把原数据移到一个单独的位置,如回滚段中,其他用户读数据时,从回滚段中把原数据读出来。
·第二种:写新数据时,原数据不删除,而是把新数据插入进来。PostgreSQL数据库使用的是第二种方法,而Oracle数据库和MySQL数据库中的InnoDB引擎使用的是第一种方法。


3)  如上所述,每张表上都有4个系统字段“xmin”“xmax”“cmin”“cmax”,这4个字段就是为多版本的功能而添加的。当两个事务同时访问记录时,通过参考xmin和xmax的标记判断记录的版本,根据版本号与自己当前的事务标识进行比较,确定自己的数据权限。当删除数据时,记录并没有从数据块中被删除,空间也没有立即释放。
***PostgreSQL的多版本实现中首先要解决的是原数据的空间释放问题。PostgreSQL通过运行Vaccum进程来回收之前的存储空间,默认PostgreSQL数据库中的AutoVacuum是打开的,也就是说,当一个表的更新量达到一定值时,AutoVacuum自动回收空间。当然也可以关闭AutoVacuum进程,然后在业务低峰期手动运行VACUUM命令来回收空间。在PostgreSQL中,若一个事务执行失败,在数据文件中该事务产生的数据并不会在事务回滚时被清理掉。为什么要这样做呢?为什么不在
事务提交时把这些数据标记成有效,而在事务回滚时把这些数据标记成无效呢?这是出于效率的考虑。若事务提交或回滚时再次标记数据,那这些数据就有可能会被刷新到磁盘中,再次标记会导致另一次I/O,从而降低性能。那么如何知道这些数据是有效还是无效呢?PostgreSQL通过记录事务的状态来实现。数据行上记录了xmin和xmax,只需了解xmin和xmax对应的事务是成功提交还是回滚了,就可以知道这些数据行是否有效。PostgreSQL把事务状态记录在Commit Log中,简称
CLOG,CLOG在数据目录的pg_clog子目录下
osdba@osdba-VirtualBox:~/pgdata$ ls -l pg_clog
total 8
-rw------- 1 osdba osdba 8192 Nov 30 21:43 0000

2. 事务的4种状态

1)
·TRANSACTION_STATUS_IN_PROGRESS=0x00:表示事务正在进行中。
·TRANSACTION_STATUS_COMMITTED=0x01:表示事务已提交。
·TRANSACTION_STATUS_ABORTED=0x02:表示事务已回滚。
·TRANSACTION_STATUS_SUB_COMMITTED=0x03:表示子事务已提交。

2)事务ID,在PostgreSQL中有时缩写为xid,是一个32bit的数字。有以下3个特殊的事务ID是给系统内部使用的,代表特殊的含义。
·InvalidTransactionId=0:表示是无效的事务ID。
·BootstrapTransactionId=1:表示系统表初使化时的事务ID。
·FrozenTransactionId=2:冻结的事务ID。

3)所以数据库系统第一个正常的事务ID是从3开始的,然后连续递增,达到最大值后,再从3开始。事务ID为0、1、2的始终保留。通常,使用值为0的事务ID是为了让内部编程更为方便,当PostgreSQL内部的事务ID设置为0时,表示它是一个无效的事务ID。比如,使用函数GetCurrentTransactionIdIfAny查询当前的事务ID时,如果返回的事务ID为0,则表示当前还没有分配事务ID。值为1的事务ID是Initdb服务初始化系统表时在表上填写的事务ID,此时数据库还没有启动,但在系统表中的cmin下也需要一个有效的事务ID,这个事务ID就为1,示例如下:
os dba=# select cmin, cmax, relname from pg_class where relname in ('pg_type','pg_attribute');
cmin | cmax | relname
------+------+--------------
1 | 1 | pg_type
1 | 1 | pg_attribute
(2 rows)

3. PostgreSQL多版本的优劣分析

Oracle数据库和MySQL数据库的InnoDB引擎也都实现了多版本的功能,但它们与PostgreSQL的实现方式是不一样的,在这两个数据库中,旧版本的数据并不记录在原先的数据块中,而是被记录在回滚段中,如果要读取旧版本的数据,需要根据回滚段的数据重构旧版本数据。

--相对于InnoDB和Oracle,PostgreSQL的多版本的优势在于以下几点:
1)·事务回滚可以立即完成,无论事务进行了多少操作。
2)·数据可以进行很多更新,不必像Oracle和InnoDB那样需要经常保证回滚段不会被用完,也不会像Oracle数据库那样,经常遇到“ORA1555”错误的困扰。

--相对于InnoDB和Oracle,PostgreSQL的多版本的劣势在于以下几点:
1)·旧版本数据需要清理。PostgreSQL清理旧版本称为VACUUM,并提供了VACUUM命令进行清理。
2)·旧版本的数据会导致查询更慢一些,因为旧版本的数据存储于数据文件中,查询时需要扫描更多的数据块

http://www.niftyadmin.cn/n/5033745.html

相关文章

Linux MyFile

在之前,我们应该都多少接触过了C语言的文件管理,fopen,fclose,fputs....等函数的用法,也分析了系统层面上C语言是如何实现文件管理的。 回顾 上一个文章,我们讲解了十分重要的知识,在文件被打…

华为云云耀云服务器L实例评测|一个2C2G3M的云服务器能做哪些有趣的事儿?

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 看这里 前言效果图选购服务器机器人部署启动机器人WX机器人的使用前言 一个人拥有一个2C2G3M的服务器,能干哪些有趣的事儿? 也许,你上线了你的小程序,用它当做你的服务接口端; 也许,你上线了你的博客站,用它作为你…

强信创,高实用:SuperMap开发者线上训练营9月25日起航

当前,信创工作全面开展,从细分领域延展至所有领域,自主GIS技术也迈入新的发展阶段。2023年9月25日至9月27日,北京超图软件股份有限公司、917书院GIS学堂将主办以“强信创、高实用”为主题的SuperMap开发者训练营(以下简…

IntelliJ IDEA使用——插件推荐

官网插件库:https://plugins.jetbrains.com/search 代码规范检测:Alibaba Java Coding Guidelines码云:Giteemybatis插件:MyBatisX多颜色括号:Rainbow Brackets操作快捷键提示:Key Promoter X力扣&#xff…

计算机视觉的应用15-图片旋转验证码的角度计算模型的应用,解决旋转图片矫正问题

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用15-图片旋转验证码的角度计算模型的应用,解决旋转图片矫正问题,在CV领域,图片旋转验证码的角度计算模型被广泛应用于解决旋转图片矫正问题,有效解决机…

Ubuntu 22.04 安装配置 flatpak

Ubuntu 22.04 安装配置 Flatpak 安装 Flatpak sudo apt install flatpakFlatpak 仓库配置 官方仓库 https://flathub.org/repo/flathub上交大镜像 https://mirror.sjtu.edu.cn/flathub flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatp…

scrapy框架--

Scrapy是一个用于爬取数据的Python框架。下面是Scrapy框架的基本操作步骤: 安装Scrapy:首先,确保你已经安装好了Python和pip。然后,在命令行中运行以下命令安装Scrapy:pip install scrapy 创建Scrapy项目:使用Scrapy提供的命令行工具创建一个新的Scrapy项目。在命令行中切…

从过去5年CWE TOP 25的数据看软件缺陷的防护

作者: Uncle_Tom 原文链接:https://bbs.huaweicloud.com/blogs/410171 1. 前言 2023年的 CWE 危险性最高的安全缺陷已经公布:《2023年最具威胁的25种安全漏洞(CWE TOP 25)》, 这对于安全防护人员、代码检查工具的开发人员非常重要。从2019年开始&#…