PG的多版本并发控制(二)

太阳11个月前技术文章392

二、 PG数据库DML操作的相关概念

xmin、xmax、cmin、cmax是每个数据行tuple上的隐藏字段,主要用于区别不同事务以及相同事务内tuple的行版本。在了解这四个参数概念前,我们首先需要知道,每个事务都会分为一个事务ID,在同一个事务中执行的每条命令都会分配一个命令ID。


  • xmin : 当一个事务插入一条新的数据行时,将该数据行的xmin标识为当前事务的事务ID

  • xmax :新插入的数据行的xmax默认为0,当一个事务删除一条数据行时,将该数据行的xmax标识为当前事务的事务ID,相当于做了一个删除标记。

  • cmin/cmax : 在同一事务内,当该命令操作导致会插入/删除操作时,使用cmin、cmax进行计数

2.1 t_xmin、t_xmax行为方式

当新插入一行数据时,将xmin设置为当前事务ID、xmax设置为0;

当删除某一行记录时,将该记录行的xmax设置为当前的事务ID;

当修改某一行时,实际上是将旧数据行的xmax设置为当前事务ID,然后新插入变更后的数据行,并将该数据行的xmin设置为当前事务ID

INSERT

image.png

DELETE

image.png

UPDATE

image.png


2.2 cmin、cmax的行为方式(t_cid)

在每个事务在事务开始的时候,命令标识计数器被初置为0,每当执行更新命令(如I\U\D\select ... for update)时,SQL执行后的命令标识计数标计数值+1。PG每个事务中的命令标识计数最大为2^23-1个,若超过该数据后就会发生回卷,计数器开始从0开始计数。

2.3 commit log(CLOG)

commit log也被称为clog,它是pg数据库共享内存中的一块区域,主要用来保留各个事务的事务状态,主要包含以下四种状态: IN_PROGRESS、COMMITTED、ABORTED、SUB_COMMITTED。clog由一个或多个8K的数据页组成,逻辑上以数组的形式记录每个t_xid的事务状态。随着事务的不断增长,clog也会不断增大,此时pg数据库的vacuum process就会负责对clog中无效数据进行清理。

  • IN_PROGRESS :表示事务正在进行中

  • COMMITTED :表示事务已提交

  • ABORTED :表示事务已回滚

  • SUB_COMMITTED :表示子事务已提交

image.png


当数据库关闭或者检查点运行时,pg会将clog的数据全部记录在 $PGDATA 中的 pg_xact 目录下的0000、0001文件中进行落盘;当数据库启动时,加载 pg_xact 文件中对事务状态的记录来初始化clog。

在PG数据库中,若一个事务失败,在数据文件中这个事务产生的数据并不会在事务回滚时被清理掉。这样做主要是出于效率考虑,避免事务在回滚或者提交时再次标记数据而额外的多产生一次IO消耗,当事务提交/回滚时会通过共享内存中的clog将所有事务的事务状态进行记录,只需要通过tuple上的tmin、tmax就可以知道对应的事务是成功提交还是回滚掉了,验证记录行的有效性。

2.4 事务快照

事务快照以“xmin:xmax:xip_list”的形式进行存储,可通过内置函数txid_current_snapshot()进行调用查看当前事务下的事务快照信息。通过事务快照我们可以清楚的知道当前事务下一些活跃与非活跃状态的事务信息,并通过tuple的xmin、xmax、clog的事务状态进行一定的版本控制。xmin : 事务当前状态下最早的活跃事务,此事务ID之前的所有事务都为非活跃状态

  • xmax : 事务当前状态下下最早的活跃事务,该事务ID之后的所有事务都为活跃状态

  • xip_list : 当前事务链下xmin与xmax之前所有活跃的事务ID号列表

需要我们注意的就是,事务快照在同一个事务中并不是一成不变的,若在事务未完成之前并发其他事务提交,在不同的时间点该事务下的事务快照信息是不一样的。

image.png


标签: PostgreSQL

相关文章

PG的pathman分区表工具

一、概述在PG<=10的版本中,都是通过表继承的方式进行分区的,必须使用CHECK CONSTRAINT将每个分区创建为子表 。PostgreSQL 10提供了本机分区,它与经典方法没有什么不同...

PG的统计信息(三)

1.3 数据分布类统计信息1.3.1 pg_stats通过对pg_stats的查询,可以查看每个字段的数据分析统计信息,类似SQL Server的直方图,为优化器选择最佳执行计划提供依据,pg_sta...

REPMGR-PG高可用搭建(一)

REPMGR-PG高可用搭建(一)

PG高可用对比数据库复制的术语和定义这些术语和定义应该有助于讨论复制。在与其他Postgres开发人员进行了大量讨论之后,我编译了它们,但是这些定义应该是普遍可用的,并且也应该适用于其他RDBMS。复...

PG的pg_stat_statements插件

pg_stat_statements可追踪一个服务器所执行的所有 SQL 语句的执行统计信息,可以用于统计数据库的资源开销,分析TOP SQL。一、插件安装1、编译安装进入postgresql源码目录...

PG的锁(二)

四、死锁PostgreSQL自动检测死锁情况并会自动回滚其中一个事务进行处理,从而其他事务完成。db1=# select * from t1 where id in (1,2,3);  id | i...

PG初识

PG数据库是一种典型的C/S模型应用,不同的客户端通过TCP/IP进行连接、每个连接启动一个fork进程(多进程数据库)。一、pg逻辑架构1.1 pg与MySQL异同对比逻辑架构postgresMyS...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。