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

太阳1年前技术文章301

一、 表系统字段几个比较重要概念

1.1  tuple

tuple表示表中的数据行,在MySQL中用row表示。

在表数据页中,主要分为普通的数据元祖和TOAST元祖。以下是一个普通数据元祖的结构,主要由三部分组成:HeapTupleHeaderData结构、NULL bitmap、user data。

image.png

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

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

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

  • t_ctid : ctid标识了一个数据行tuple在表中的物理位置,ctid可以快速定位数据行,但是随着表数据的变更,在发生vacuum full之后,数据行对应的物理位置可能会发生改变。

1、数据库中查看tuple的ctid

## 查看当前数据行对应的ctid

db1=# select ctid,* from t1;
 ctid  | id
-------+----
 (0,1) |  1
 (0,2) |  1
 (0,3) |  1
 (0,4) |  2
 (0,5) |  2
 (0,6) |  3
 (0,7) |  3
 (0,8) |  3
(8 rows)


2、数据库中查看tuple的xmin、xmax、ctid

db1=# select xmin,xmax,cmin,cmax,* from t2;
  xmin   | xmax | cmin | cmax | id | name
---------+------+------+------+----+------
 1738613 |    0 |    0 |    0 |  1 | aa
 1738614 |    0 |    0 |    0 |  2 | bb
 1738615 |    0 |    0 |    0 |  3 | cc
(3 rows)


1.2 事务id(txid)

当每个事务开始时,事务管理器都会分配一个唯一的标识符,也就是事务ID(txid), postgresql的txid是一个32位无符号整数,大约42亿。在数据库中可通过内置函数txid_current()查看当前事务ID号。

不会为BEGIN命令分配txid。在PG中,当BEGIN命令后,执行第一个命令时,事务管理器会分配tixd,然后启动其事务。

db1=# begin;
BEGIN
db1=# SELECT txid_current();
 txid_current
--------------
      1738649
(1 row)


postgres保留了以下三个特殊的事务ID号:

  • 0 :无效事务ID。

  • 1 :系统表初始化时事务ID

  • 2 :冻结的事务ID

txid之间可以做比较,小于当前txid的事务为“past”,默认都是对当前事务可见的,大于当前txid的事务为称为“Future”,默认都是对当前事务不可见的。


image.png

pg的事务存在上限,随着事务ID的不断增长,达到最大值后再从头开始计数,就会出现以前的事务ID比当前的事务ID大的情况,按照上面的比较规则,就会认为最新产生的事务为“past”,这也是PG数据库中比较严重的事务回卷的问题。

为了解决事务回卷的问题,PG规定最新与最旧的两个事务之间的年龄差最大为231,如果事务之间的年龄差超过231时,就把旧的事务全部转换为事务ID号为2的冻结事务。当新事务与冻结事务做比较时,默认正常事务ID比冻结事务ID新。整体来讲可利用如下公式进行计算:((int32) (id1-id2)) < 0

如果该公式为真,则表示事务id1比事务id2旧。

当事务没有发生回卷时,上面公式相当于直接比大小即可。

当事务发生回卷时,例如id1=4294967295,id2=5,那么id1-id2=4294967290,将这个个差值转换为有符号的int32时,由于超过了2^31该数据会转换为一个负数,这样一来我们还是可以比较出id1比id2旧。



标签: PostgreSQL

相关文章

PG的统计信息(三)

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

PG的pg_stat_statements插件

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

PG的统计信息(一)

一、统计信息1.1 PG统计信息概述pg的统计信息主要分为两种:第一类统计信息是是负载指标“统计信息”(Monitoring stats),通过stat collector进程进行实时采集更新的负载指...

PG安装部署

一、rpm包安装部署1、安装RPM包# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_6...

PG参数整理

一、参数的分类参数的类型名称说明internal内部参数,只读无法修改。postgres程序写死或者是在初始化指定后无法修改的参数postmaster更改该类参数,需重启生效sighup不需重启,重新...

PG体系结构(三)

PG体系结构(三)

四、物理结构4.1 软件安装目录bin             //二进制可执行文件 include         //头文件目录 lib             //动态库文件 share ...

发表评论    

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