iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL XID与virtual XID区别
  • 629
分享到

PostgreSQL XID与virtual XID区别

2024-04-02 19:04:59 629人浏览 独家记忆
摘要

    PG中事务号有两个概念,一个就是通常意义上的事务号transaction id。如tuple中的xmin,xmax等。另外一个意义是虚拟事务ID,即virtual

    PG中事务号有两个概念,一个就是通常意义上的事务号transaction id。如tuple中的xmin,xmax等。另外一个意义是虚拟事务ID,即virtual transaction ID。那么这两个有

什么区别呢?

 

1.Transaction Id

     它是用来标识事务的顺序的,类似于oracle的LSN(Logical Sequence Number)。但是PG中的这个事务号是可以wrap的,也就是重复使用的。

PG定义此事务ID为32位长度。相当于4 billion。因为是重复使用的,所以首尾相接,构成一个环。那也就是说,对于任何一个事务ID,有2 billion的事务ID比自己old,

有2 billion的事务比自己new。另外有三个事务ID有特殊意义:”0”代表invalid 事务号,”1”代表bootstrap事务号,“2”代表frozen 事务,“3”代表最小的用户事务ID。

另外,1“和”2“也都是valid。frozen transaction id比任何事务都要old。PG用来解决事务号wrap问题,在事务号循环使用情况下,可能会出现新的事务号比老的事务号要小。

因此将老的事务号设置为”2”,表示是frozen transaction。frozen transaction id的动作由vacuum发起。具体介绍请我的另外一篇文章”postgresql vacuum原理—vacuum揭秘“。

transaction id的产生受lwlock ”XidGenLock“保护,存放在ShmemVariableCache共享内存段中。

transaction id 源码定义如下:

PostgreSQL  XID与virtual XID区别

事务号类型定义:

PostgreSQL  XID与virtual XID区别

 

2.Virtual Transaction Id

   也就是通常所讲的虚拟事务ID。virtual transaction id 由两部分组成,backend process ID 号和local transaction id组成。

backend process ID 号不是操作系统的进程ID,而是PG中用来标识进程序列号的ID。而local transansaction id也是用32位长度来表示。跟上面讲的transaction id的区别看名字就知道:是local和非local的差别。

也就是说这个local transaction id是每个backend 进程独有的。而上面第一部分讲的transaction id是全局的,即整个PG cluster 级别的。

PostgreSQL  XID与virtual XID区别

图中第一个红色圈中部分就是全局的transaction id。而第二圈中的内容就是virtual transaction id。 backend id号和local transaction id用”/“符号分隔。

前面部分为backend id号,后面部分为local transaction id。第三个红色圈中部分为系统进程号。这里明显看到,virtual transaction id中的backend id号跟第三个红色圈中的pid是不同的。
pid是操作系统的进程号。virtual transaction id只有valid 和invalid之分。”0“表示为invalid,其它都是valid。另外,virtual transaction id 在数据库重起后,就会重新使用;但是在同一个backend id下会按顺序增长。

virtual transaction id的持有,都是ExclusiveLock,因为在一个进程私有空间内,不存在争用情况。这点上,跟transaction id是一样的,transaction id是全局独享的,因此也是ExclusiveLock。

从上面图中的mode列,我们可以清晰的看到。

定义如下:

PostgreSQL  XID与virtual XID区别

 

3.总结

为什么PG会搞这么两个transaction id呢,用途和意义是什么呢?

    我们知道,像类似于SELECT语句,并不会改变数据库;而DML语句会对数据库状态产生影响。因此这也就是为什么区别对待的原因。

transaction id属于permanent id,即永久ID。它的意义是指对数据库的更改序列,使得数据库从一种状态变成另外一种状态,而且状态的改变是持久的,可恢复,是一致性的。

这也符合的数据库理论ACID的要求。

    而查询,实际上并不需要这种永久事务ID,只需要处理好mvcC,的获取和释放即可,因此virtual transaction id也就足够了。不需要去获取XidGenLock而产生transaction id,

从而提高数据库性能。另外,数据库也不会因为查询而导致transaction id快速wrap around。MVCC的处理是不需要transaction id值的。当查询时,获取当前每个活动进程的xmin和xmax值,

以此区间去对比每个tuple header中的xmin和xmax即可得到可见性snapshot。MVCC详细实现见”Postgresql MVCC 源码实现“。

    另外获取的时机也有很大差别。PG的事务实现有三层,分别为top layer, middle layer 和bottom layer。virtual transaction id在top layer中获取。不管是查询,还是DML操作,每个

命令都有virtual transaction id。而transaction id是在bottom layer中获取的,只有真正涉及到数据修改时,才去获取。修改tuple后,会将transaction id的值存放到tuple header 中,

这也是我们通常讲的xmin或者xmax。

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL XID与virtual XID区别

本文链接: https://www.lsjlt.com/news/49040.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL XID与virtual XID区别
        PG中事务号有两个概念,一个就是通常意义上的事务号transaction id。如tuple中的xmin,xmax等。另外一个意义是虚拟事务ID,即virtual ...
    99+
    2024-04-02
  • PostgreSQL如何获取事务号XID
    这篇文章主要为大家展示了“PostgreSQL如何获取事务号XID”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PostgreSQL如何获取事务号XID”这篇文...
    99+
    2024-04-02
  • PostgreSQL中关于xid freeze的脚本有哪些
    这篇文章主要讲解了“PostgreSQL中关于xid freeze的脚本有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL中关于xid...
    99+
    2024-04-02
  • Oracle与PostgreSQL的区别有哪些
    这篇文章主要讲解了“Oracle与PostgreSQL的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle与PostgreSQL的区别有哪...
    99+
    2024-04-02
  • mysql与postgresql的区别有哪些
    MySQL和PostgreSQL是两种流行的开源关系型数据库管理系统,它们有以下几点区别: 许可证:MySQL使用GPL(通用公...
    99+
    2024-04-17
    postgresql mysql
  • PostgreSQL与MySQL之间有什么区别
    PostgreSQL和MySQL都是流行的开源关系型数据库管理系统,它们之间有一些区别。以下是一些主要区别: 数据类型支持:Po...
    99+
    2024-04-09
    PostgreSQL
  • PostgreSQL与Oracle的sql区别有哪些
    本篇内容介绍了“PostgreSQL与Oracle的sql区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2024-04-02
  • PostgreSQL中HashAggregate与GroupAggregate的区别是什么
    本篇内容介绍了“PostgreSQL中HashAggregate与GroupAggregate的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处...
    99+
    2024-04-02
  • MySQL 和 PostgreSQL 的区别
    在这篇文章中,我们将了解 MySQL 和 PostgreSQL 之间的区别。MySQL它是一个关系数据库管理系统.它是Oracle公司开发的产品。它支持Windows、Mac OS X、Linux、 BSD、UNIX、z/OS、Symbia...
    99+
    2023-10-22
  • Oracle与PostgreSQL的DDL语句与事务有什么区别
    这篇文章主要介绍“Oracle与PostgreSQL的DDL语句与事务有什么区别”,在日常操作中,相信很多人在Oracle与PostgreSQL的DDL语句与事务有什么区别问题上存在疑惑,小编查阅了各式资料...
    99+
    2024-04-02
  • C#中Abstract 、Virtual和Override的使用及区别
    1. abstract 修饰符指示所修饰的内容缺少实现或未完全实现。abstract修饰符可用于类、方法、属性、索引器和事件。在类声明中使用abstract修饰符以指示某个类只能是其...
    99+
    2024-04-02
  • C#中Abstract方法和Virtual方法的区别
    简介: c#中Abstract和Virtual比较容易混淆,都与继承有关,并且涉及override的使用。virtual可以被子类重写,而abstract必须被子类重写。virtua...
    99+
    2024-04-02
  • postgresql和mysql有哪些区别
    这篇“postgresql和mysql有哪些区别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • mysql和postgresql的语法区别
    下面是MySQL和PostgreSQL之间常见的语法区别的一些详细比较: 数据类型差异: MySQL中的TEXT数据类型最大存储容量为64KB,而PostgreSQL中的TEXT数据类型没有此限制。M...
    99+
    2023-10-03
    mysql postgresql 数据库
  • mysql和postgresql有什么区别
    MySQL和PostgreSQL是两种流行的开源关系型数据库管理系统,它们之间有一些重要的区别: 数据类型支持:PostgreS...
    99+
    2024-04-09
    mysql postgresql
  • postgresql和mysql有什么区别
    PostgreSQL和MySQL是两种不同的关系型数据库管理系统。下面是它们之间的一些区别:1. 数据类型支持:PostgreSQL...
    99+
    2023-08-25
    mysql
  • Postgresql和mysql的区别探究
    PostgreSQL和MySQL是两个流行的关系型数据库管理系统(RDBMS),具有各自的特点和优点。虽然两种数据库都可以处理大量数据,但在不同情况下,会有一些区别。下面将着重介绍PostgreSQL和MySQL的区别,并附带案例说明。  ...
    99+
    2023-09-01
    数据库 postgresql mysql
  • Oracle与PostgreSQL的NULL和索引使用区别是什么
    这篇文章主要讲解了“Oracle与PostgreSQL的NULL和索引使用区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Oracle与Postgr...
    99+
    2024-04-02
  • postgresql和mysql的区别有哪些
    这篇文章主要为大家展示了“postgresql和mysql的区别有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“postgresql和mysql的区别有哪些...
    99+
    2024-04-02
  • MariaDB和PostgreSQL之间有何区别
    MariaDB和PostgreSQL都是流行的开源关系型数据库管理系统,但它们之间有一些区别: 历史和支持:MariaDB起源于M...
    99+
    2024-04-09
    MariaDB
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作