PostgreSQL开发与实战(7)多版本并发控制1

作者:太阳

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

1.1 tuple

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

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

在这里插入图片描述

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”,默认都是对当前事务不可见的。

在这里插入图片描述

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旧。

更多技术信息请查看云掣官网https://yunche.pro/?t=yrgw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/468349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何进行软件安全性测试?CMA、CNAS软件安全测试报告获取

软件安全性测试是保障软件应用安全的重要手段&#xff0c;通过对软件系统的安全性进行全面评估和检测&#xff0c;以确保软件能够抵御各种潜在的安全威胁和风险。那么如何进行软件安全性测试?CMA、CNAS软件安全测试报告又该如何获取呢? 软件安全性测试是一种基于黑盒测试的方…

数据可视化-ECharts Html项目实战(3)

在之前的文章中&#xff0c;我们学习了如何创建堆积折线图&#xff0c;饼图以及较难的瀑布图并更改图标标题。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 …

C#类型转换

C#类型转换 隐式类型转换 类型转换从根本上说是类型铸造&#xff0c;或者说是把数据从一种类型转换为另一种类型。在 C# 中&#xff0c;类型铸造有两种形式&#xff1a; 隐式类型转换 - 这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如&#xff0c;从小的…

深入理解与实践AB测试:从理论到实战案例解析

一、引言 在互联网产品优化和运营策略制定中&#xff0c;AB测试&#xff08;也称为分组测试或随机化对照实验&#xff09;是一种科学且严谨的方法。它通过将用户群体随机分配至不同的实验组&#xff08;通常是A组和B组&#xff09;&#xff0c;对比不同版本的产品或策略对关键…

CMake+vcpkg+VS2022配置github上的cmake开源项目外部库

我们以采用 GitHub 上的开源库 cuda-bundle-adjustment 为例&#xff0c;其不能直接用vcpkg进行安装&#xff0c;只能通过cmake编译后链接到VS2022。 将 cuda-bundle-adjustment 库通过 CMake 编译链接到 Visual Studio 2022 步骤操作&#xff1a; 克隆存储库&#xff1a;使用…

【实验01 扩展实验】C#桌面项目:简易计算器

【实验要求】 &#xff08;1&#xff09;新建一个C#桌面项目Calc&#xff0c;实现简易计算器功能&#xff0c;界面如图1所示。 &#xff08;2&#xff09;计算方式&#xff1a;通过点击对应的按钮&#xff0c;输入第1个数&#xff08;可以是整数或实数&#xff09;&#xff0c…

呵护地球不止一小时 食品行业如何为地球减负

“关爱地球,熄灯一小时”。作为全世界规模最大的应对气候变化行动之一,“地球一小时”自2007年进入中国以来,一直广受关注,社会各界竞相支持并参与。2024年,该活动以“为地球献出一小时”为主题,呼吁社会各界以实际行动为地球减负。 作为与大众日常生活息息相关的食品企业该如何…

【C++】堆区空间的申请和释放--- 2024.3.19

目录 C和C的区别&#xff08;申请堆区空间&#xff09;C中的new和delete结束语 C和C的区别&#xff08;申请堆区空间&#xff09; 在c语言中&#xff0c;在遇到需要申请一块堆区空间时&#xff0c;我们往往会使用malloc申请&#xff0c;使用free进行释放&#xff0c;但是为什么…

BUUCTF-Ezsql1

1.打开靶机 打开第一个链接 2.万能密码 使用万能密码&#xff1a;a or 1 # 密码为随意 第二个用kali打开 3.ssh连接靶机 ssh ctf284490d0-7600-4c65-9160-5ced02f45633.node5.buuoj.cn -p 28191 由题可知密码为123456 4.找到并修改index.php文件 找到index.php文件 #内容如…

Trait与生命周期

原文链接&#xff1a;(*∇&#xff40;*) 咦,又好了~ Rust – xiaocr_bloghttp://www.xiaocr.fun/index.php/2024/03/18/trait%E4%B8%8E%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/ 目录 Trait 定义trait 默认实现 trait作为参数 Trait Bound语法 通过指定多个 trait bound …

【C++】内存管理和模板基础(new、delete、类及函数模板)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 内存分布 C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 operator new与operator d…

Cesium:绘制一个 3DTiles 对象的外包盒顶点

作者:CSDN @ _乐多_ 本文将介绍如何使用 Cesium 引擎根据模型的中心坐标,半轴信息,绘制一个 3DTiles 对象的外包盒顶点。 外包盒是一个定向包围盒(Oriented Bounding Box),它由一个中心点(center)和一个包含半轴(halfAxes)组成。半轴由一个3x3的矩阵表示,这个矩阵…

Apache Dolphinscheduler - 无需重启 Master-Server 停止疯狂刷日志解决方案

记录的是一个 3.0 比较难搞的问题&#xff0c;相信不少使用过 3.0 的用户都遇到过 Master 服务中存在一些工作流或者任务流一直不停的死循环的问题&#xff0c;导致疯狂刷日志。不过本人到现在也没找到最关键的触发原因&#xff0c;只是看到一些连锁反应带来的结果…… 影响因素…

qmldir的理解

目录结构&#xff1a; 文件内容 qmldir中&#xff1a; module QtLocaion plugin declarative_location classname QtLocationDeclarativeModule typeinfo plugins.qmltypes 其中&#xff1a; QtLocaion必须与qmldir所在的文件夹名字一样 plugin 后面的declarative_location 为…

SHELL——条件判断语句练习

目录 一、练习题目 二、解答过程 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查次磁盘剩余空间。 安装邮件服务 配置邮件服务 编写脚本work1.sh 添加计划任务 2、判断web服务是否运行&#xff1a;…

项目中遇到的sql问题记录

有一张表&#xff0c;表结构及数据如下&#xff1a; INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) VALUES (approve001, 2021-02-18 00:00:00, tableA, 2024-03-18); INSERT INTO test.test_approve(approve_no, tra_date, tablename, part_dt) …

【Linux】日常使用命令(三)

文章目录 **cal 命令****date 命令****bc 命令****Linux下玩小游戏**&#xff1a; cal 命令 功能描述: cal 命令用于显示日历。 常用选项: -3&#xff1a;显示前一个月、当前月和下一个月的日历。-y&#xff1a;显示整年的日历。 常用示例: # 示例 1: 显示当前月的日历 cal# …

Easy Connect下载(Windows版)

文章目录 1. 下载连接2. 安装 1. 下载连接 百度网盘链接&#xff1a;https://pan.baidu.com/s/13r4wxz-Df3S_IMruZIDucw  提取码&#xff1a;mmcc 2. 安装 1. 下载安装包解压后&#xff0c;双击.exe文件就可以安装软件。 2. 耐心等待&#xfeff;&#xfeff;Easy Connect安装…

Android 开发环境搭建(Android Studio 安装图文详细教程)

Android Studio 下载 https://developer.android.google.cn/studio?hlzh-cn Android Studio 安装 检查电脑是否启用虚拟化 如果没有开启虚拟化&#xff0c;则需要进入电脑的 BIOS 中开启 直接 next选择安装的组件&#xff0c;Android Studio 和 Android 虚拟设备&#xff…

Gitlab-runner注册与配置

文章目录 概要操作流程获取HTTPS证书上传证书修改gitlab-runner dns配置文件gitlab-runner 注册 概要 本文主要介绍了Gitlab-runner在内网环境注册到gitlab的操作方式。内网环境如下&#xff1a; 1、gitlab-runner由docker镜像部署&#xff1b; 2、gitlab部署与内网&#xff0…