PostgreSQL10基础(7)MVCC

2024-02-25 04:58
文章标签 基础 mvcc postgresql10

本文主要是介绍PostgreSQL10基础(7)MVCC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考书籍: 《PostgreSQL10 High Performance》

MVCC即Multi Version Concurrency Control多版本并发控制,为提升多用户访问同样的数据而设计,性能优于锁定。被广泛用于诸多主流数据库。

内部可见性计算

当一个事务创建时,数据库会更新一个事务ID计算器,通常叫做XID。

  • 当插入一行或更新数据时,一个新行被创建(更新也会创建新行),该新行有一个字段insertion XID(通常称作xmin),记录了当前事务ID
  • 当删除数据时,每个被删除行有个delete XID(通常称作xmax),当行未被删除时值为空
select txid_current(),xmin,xmax,id from test

txid_current()函数返回当前查询的XID

如果一个查询开始,行数据被找到的条件为

(查询XID >= xmin) && ((查询XID <= xmax) || 查询XID is null)

每个数据库客户会话都允许同时修改表,但他们只有在事务提交后才对其他会话可见。

示例

会话1启动事务并更新数据但不提交
# begin;
BEGIN# select txid_current(),xmin,xmax,* from test;txid_current |   xmin   | xmax | id | name
--------------+----------+------+----+------81911792 | 81911784 |    0 |  1 | 181911792 | 81911785 |    0 |  2 | 2
(2 rows)# update test set name='new' where id=2; 
UPDATE 1dd=# select txid_current(),xmin,xmax,* from test;txid_current |   xmin   | xmax | id | name
--------------+----------+------+----+------81911792 | 81911784 |    0 |  1 | 181911792 | 81911792 |    0 |  2 | new
(2 rows)
会话2 查询数据

因会话1未提交,会话2XID大于修改数据的XMAX值,因此看不到最新版本数据,只能看到老版本未修改的数据

# select txid_current(),xmin,xmax,* from test;txid_current |   xmin   |   xmax   | id | name
--------------+----------+----------+----+------81911793 | 81911784 |        0 |  1 | 181911793 | 81911785 | 81911792 |  2 | 2
(2 rows)
会话1 提交

提交后xmax被清空

# commit;
COMMIT

如果会话没有提交而是回滚,则直接删除新版本数据即可。

会话2再次查询(事务中)或新会话 查询数据

因为xmax被清空,因此可以查到提交的数据

# select txid_current(),xmin,xmax,* from test;txid_current |   xmin   | xmax | id | name
--------------+----------+------+----+------81911794 | 81911784 |    0 |  1 | 181911794 | 81911792 |    0 |  2 | new
(2 rows)

dd=# commit;
COMMIT

更新数据行的实际过程

  • 读入原行数据
  • 根据update修改数据字段
  • 将新数据行及其XID写入到新的磁盘
  • 旧数据行在不再被使用后,可以被Vacuum删除

删除数据行的实际过程

  • 标记原行数据为删除,并更新XID
  • 旧数据行在不再被使用后,可以被Vacuum删除

Heap only tuples(HOT)

上文提到更新和删除的过程,HOT在特定条件下允许直接重用更新和删除操作数据行后的磁盘空间。

例如更新行没有更新任何索引字段,如果新数据行可以被当前数据行所在数据页剩余空间容纳下时。将触发一个数据块上的mini vacuum。正常的Vacuum需要更新数据heap和Index,而mini vacuum只更新数据heap,因此称为heap only。

pg_stat_user_tables视图记录了表上所有更新次数n_tup_upd和HOT更新次数n_tup_hot_upd

MVCC优缺点

优点

最大程度避免了锁定,读数据不会与写数据发生冲突,读不会阻塞写,写也不会阻塞读。

缺点

  • 占用了磁盘空间,需要进行Vacuum清扫
    • 更新时使用了新的磁盘,老数据未被删除
    • 删除时老数据未被真正删除磁盘
  • 要当心不可重复读和脏读问题

事务ID环绕

事务ID是32比特,大约20亿个ID,超出则会变为0。MVVC的可见机制将会出现问题。

为了解决问题

  • 每个数据库和每张表都有一个引用XID,可见于pg_class表relfrozenxid字段,该字段记录本表或数据库最小XID,小于该值得XID都见被置为保留的冻结ID,Vacuum将处理这些XID

这篇关于PostgreSQL10基础(7)MVCC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744457

相关文章

C#基础之委托详解(Delegate)

《C#基础之委托详解(Delegate)》:本文主要介绍C#基础之委托(Delegate),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 委托定义2. 委托实例化3. 多播委托(Multicast Delegates)4. 委托的用途事件处理回调函数LINQ

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou