pg事务:multixact

news2024/9/21 3:30:22

什么是multixact?

在对同一行加锁时,元组上关联的事务ID可能有多个,pg将多个事务ID组合起来用一个MultiXactID来管理。TransactionId和MultiXactID是多对一的关系

在这里插入图片描述

multixactID跟TransactionId一样,也是32位,同样有wraparound

MultiXactId的0、1都是系统使用,可分配的MultiXactId从2开始

源码src/include/access/multixact.h
#define InvalidMultiXactId	((MultiXactId) 0)
#define FirstMultiXactId	((MultiXactId) 1)
#define MaxMultiXactId		((MultiXactId) 0xFFFFFFFF)

行锁的类型

只有行上有锁时,才会有multixact。MultiXact总共定义了6种状态

typedef enum
{
MultiXactStatusForKeyShare = 0x00,
MultiXactStatusForShare = 0x01,
MultiXactStatusForNoKeyUpdate = 0x02,
MultiXactStatusForUpdate = 0x03,
/* an update that doesn't touch "key" columns */
MultiXactStatusNoKeyUpdate = 0x04,
/* other updates, and delete */
MultiXactStatusUpdate = 0x05
} MultiXactStatus;

其中能显示声明的行锁的状态有4种:ForKeyShare,ForShare,ForNoKeyUpdate,ForUpdate

multixact的infomask标记

pg会将行锁标记到xmax上并记录到infomask中
源码src/include/access/htup_details.h

#define HEAP_XMAX_KEYSHR_LOCK	0x0010	/* xmax is a key-shared locker */
#define HEAP_XMAX_EXCL_LOCK		0x0040	/* xmax is exclusive locker */
#define HEAP_XMAX_LOCK_ONLY		0x0080	/* xmax, if valid, is only a locker */
#define HEAP_XMAX_SHR_LOCK	(HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)
#define HEAP_LOCK_MASK	(HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | \
						 HEAP_XMAX_KEYSHR_LOCK)
#define HEAP_XMAX_IS_MULTI		0x1000	/* t_xmax is a MultiXactId */

这里重点模拟HEAP_XMAX_IS_MULTI标记,只有多个事务对同一行持有共享锁时才真正产生multixact id,才会有此标记

lzldb=# insert into lzl1 values(1);  --初始只有1行数据
INSERT 0 1
lzldb=# select * from vlzl1;
 t_ctid | lp | lp_flags  | t_xmin | t_xmax | t_cid |            raw_flags             | combined_flags 
--------+----+-----------+--------+--------+-------+----------------------------------+----------------
 (0,1)  |  1 | LP_NORMAL |    742 |      0 |     0 | {HEAP_HASNULL,HEAP_XMAX_INVALID} | {}
(1 row)
窗口1窗口2
lzldb=# begin;
BEGIN
lzldb=*# select * from lzl1 for share;
a

1
lzldb=# begin;
BEGIN
lzldb=*# select * from lzl1 for share;
a

1
lzldb=*# update lzl1 set a=2; --hang
commit;
UPDATE 1 --update更新完成
--查看元组xmax、infomask情况
lzldb=*#  select t_ctid,lp,t_xmin,t_xmax,(t_infomask&4096)!=0 is_multixact  from heap_page_items(get_raw_page('lzl1',0));
 t_ctid | lp | t_xmin | t_xmax | is_multixact 
--------+----+--------+--------+--------------
 (0,2)  |  1 |    742 |      4 | t
 (0,2)  |  2 |    744 |      3 | t

HEAP_XMAX_IS_MULTI的16进制值是1000,转换为10进制为4096,通过(t_infomask&4096)!=0 is_multixact可以看出元组是否使用了multixact id。从上面的例子可以看出:

  • multxact id不同于transaction id,它有自己的取值空间
  • multixact id一般来说比transaction id小,所以这里t_xmax比t_xmin更小
  • 如果是一个update语句更新的元组,那么新旧元组的xmax肯定是相等的。但是在multixact的场景下,可能就不一样了。

multixact slru

虽然src/backend/access/transam/multixact.c的开头定义很多变量和函数,有page,member,membergoup,offset,但是总体都是定义变量值,然后定义这些变量进行相互转化的函数

读懂multixact.c前需要先了解几个宏定义

src/include/c.h中定义MultiXactOffset是32位的类型

typedef uint32 MultiXactOffset;

src/include/access/slru.h中定义每个段有多少SLRU PAGES

#define SLRU_PAGES_PER_SEGMENT	32

回到src/backend/access/transam/multixact.c的开头

define MULTIXACT_OFFSETS_PER_PAGE (BLCKSZ / sizeof(MultiXactOffset))  
//MULTIXACT_OFFSETS_PER_PAGE=8k/32B=2048 一个page可以存储2048个offsets标识位,其实也是2048个MULTIXACTID

#define MultiXactIdToOffsetPage(xid) \
	((xid) / (MultiXactOffset) MULTIXACT_OFFSETS_PER_PAGE)
//通过xid转换为对应记录的位于的页面:xid/2048

#define MultiXactIdToOffsetEntry(xid) \
	((xid) % (MultiXactOffset) MULTIXACT_OFFSETS_PER_PAGE)
//通过xid转换为对应记录位于页面的偏移量:xid%2048

#define MultiXactIdToOffsetSegment(xid) (MultiXactIdToOffsetPage(xid) / SLRU_PAGES_PER_SEGMENT)
//通过xid转换为对应记录位于的segment:xid/2048/32

再看下源码开头的注释

/* 
 * Defines for MultiXactOffset page sizes.  A page is the same BLCKSZ as is
 * used everywhere else in Postgres.
 *
 * Note: because MultiXactOffsets are 32 bits and wrap around at 0xFFFFFFFF,
 * MultiXact page numbering also wraps around at
 * 0xFFFFFFFF/MULTIXACT_OFFSETS_PER_PAGE, and segment numbering at
 * 0xFFFFFFFF/MULTIXACT_OFFSETS_PER_PAGE/SLRU_PAGES_PER_SEGMENT.  We need
 * take no explicit notice of that fact in this module, except when comparing
 * segment and page numbers in TruncateMultiXact (see
 * MultiXactOffsetPagePrecedes).
 */

因为MultiXactOffsets是32位且有wraparound,所以

MultiXact页编号回卷于0xFFFFFFFF/MULTIXACT_OFFSETS_PER_PAGE=232/2048=2^21

段编号回卷于0xFFFFFFFF/MULTIXACT_OFFSETS_PER_PAGE/SLRU_PAGES_PER_SEGMENT=232/211/25=2^16

TruncateMultiXact()会清理这些段包括页编号,TruncateMultiXact()被vacuum调用

pg_multixact目录

同CLOG,SUBTRANS日志一样,multixact日志SLRU缓冲池实现。pg_multixact目录下只有两个目录member,offset

[pg@lzl pg_multixact]$ ll
total 8
drwx------ 2 pg pg 4096 Feb 14 21:29 members
drwx------ 2 pg pg 4096 Feb 14 21:29 offsets

一个mutixactid有对应多个transaction id,也就是member。offset是每个multiact的起始位置

在这里插入图片描述

typedef struct mXactCacheEnt
{
	MultiXactId multi; //一个MultiXactId
	int		nmembers;
	dlist_node	node;
	MultiXactMember members[FLEXIBLE_ARRAY_MEMBER]; //多个TransactionId,如果需要,pg用MultiXactIdExpand()扩展member
} mXactCacheEnt;

multixact.h中定义了MultiXactMember只是单个事务id和事务状态

typedef struct MultiXactMember
{
	TransactionId xid;
	MultiXactStatus status;
} MultiXactMember;

multixact参考

https://www.postgresql.org/docs/current/routine-vacuuming.html

https://pgpedia.info/m/multixact-id.html

https://www.postgresql.org/docs/15/explicit-locking.html

https://www.modb.pro/db/14939

https://www.highgo.ca/2020/06/12/transactions-in-postgresql-and-their-mechanism/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Seata AT 模式理论学习及部分源码解析 | Spring Cloud 52

理论部分来自Seata官网:http://seata.io/zh-cn/docs/dev/mode/at-mode.html 一、前提 基于支持本地 ACID 事务的关系型数据库。Java 应用,通过 JDBC 访问数据库。 二、整体机制 两阶段提交协议的演变: 一阶段:业务数据和回滚日…

【SpringCloud组件——Ribbon(负载均衡)】

一、Ribbon主要作用在哪一环节? 流程讲解: 案例依然采用Eureka章节提供的案例,orderService根据服务名称发起请求,请求传达至Ribbon,此时Ribbon从Eureka中心拉取userService服务列表,Ribbon根据负载均衡算法…

组合预测模型 | ARIMA-WOA-CNN-LSTM时间序列预测(Python)

组合预测模型 | ARIMA-WOA-CNN-LSTM时间序列预测(Python) 目录 组合预测模型 | ARIMA-WOA-CNN-LSTM时间序列预测(Python)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 ARIMA-WOA-CNN-LSTM是一种结合了传统时间序列模型和深…

ChatGPT应用场景巡航之广告文案

此文为ChatGPT应用场景巡航第二篇:广告文案。 写出成功的文案,需要专业的技术水准,如果加以辅助工具,那会更加如虎添翼,事半功倍,本文会给大家介绍一下广告文案的写作技巧和辅助工具的使用。 01 — 指导原…

8-《性能优化》

8-《性能优化》 1 启动优化1.1.冷启动耗时统计?1.2.TraceView和System Trace1.3.优雅获取方法耗时1.4.启动速度优化小技巧1.5.启动优化之异步初始化1.6.启动优化之异步初始化最优解—启动器1.7.延迟初始化1.8.其它方案1.9.启动优化之模拟面试 2 布局优化3 线程优化3…

基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(一)总体设计

2.1 引言 本课题是来源于雷达辐射源识别项目,需要对雷达辐射源中频信号进行采集传输 和存储。本章基于项目需求,介绍采集卡的总体设计方案。采集卡设计包括硬件设计 和软件设计。首先对采集卡的性能和指标进行分析,接着提出硬件的总体设计…

OPCUA 聚合服务器和历史数据服务器

前言 开放自动化是一个热门话题,自动化XML(AutomationML),基于信息模型的通信协议(OPC UA)和工业4.0 管理壳(ASS) 可谓是开放自动化的三套件。三者相互交叉,相互引用&…

教你精通Java语法之第十五章、Lambda表达式

目录 一、背景 1.1Lambda表达式的语法 1.2函数式接口 二、Lambda表达式的基本使用 2.1语法精简 三、变量捕获 3.1匿名内部类 3.2匿名内部类的变量捕获 3.3Lambda的变量捕获 四、Lambda在集合当中的使用 4.1Collection接口 4.2 List接口 4.3Map接口 五、总结 一、背…

2023国赛tomcat题

环境: 10.10.120.128 安装 tomcaA 10.10.120.129 安装tomcatB 10.10.120.130 安装 nginx 配置dns: 正向解析 反向解析 Tomcat ssl配置 [root@localhost ~]# tar -zxvf jdk-11.0.8_linux-x64_bin.tar.gz [root@localhost ~]# mv jdk-11.0.8 /usr/local/ Vim /etc/profile …

如何在代码开发中便捷使用 ChatGPT 协助开发

在五一节前后,抽空测试了下网上推荐的开发环境和开发插件,在这里推荐给前后端代码开发的同胞们。 方法一:IDEA 安装 插件 bito 习惯使用 IDEA 开发代码的同胞,可以尝试直接在 IDEA 中安装插件 bito,注意操作过程中需要…

jarvisoj_fm

小白做题垃圾笔记,不建议阅读。 1.32位操作系统,有canary,和NX ,本来以为是绕过canary呢。 2.第12行,如果x4就执行/bin/sh ,第10行存在格式化字符串漏洞。 是格式化字符串漏洞,对任意地址内容更改。 3.确定…

实操Linux 部署单机版nacos

目录 Nacos部署环境要求JDK安装下载和构建Nocas控制面板,新建配置Nacos数据库配置 总结 Nacos部署环境要求 64bit OS: Linux/Unix/Mac/Windows 支持, Linux/Unix/Mac 推荐 64bit JDK 1.8 Maven 3.2.x JDK安装 1、准备好jdk1.8 链接:https://pan.baidu.…

【SpringCloud组件——Eureka】

前置准备: 分别提供订单系统(OrderService)和用户系统(UserService)。订单系统主要负责订单相关信息的处理,用户系统主要负责用户相关信息的处理。 一、微服务当中的提供者和消费者 1.1、概念 服务提供…

第二章 逻辑分类模型

目录 一、逻辑回归基本模型二、处理多维特征输入三、加载数据集四、多分类问题 一、逻辑回归基本模型 基本模型: y ^ σ ( x ∗ ω b ) \hat{y} \sigma (x * \omega b) y^​σ(x∗ωb),其中 σ ( ) \sigma() σ() 表示 sigmod 函数 σ ( x ) 1 1…

LMS,RGB,XYZ色彩空间转换

前言 首先需要指明本文中描述的R,G,B并非通常的sRGB中的三个分量R,G,B,而是波长分别为700nm,546.1nm,435.8nm的单色红光,单色绿光,单色蓝光。sRGB中的RGB中的红色、绿色、蓝色已经不是单色光了。虽然习惯上大家都叫RGB…

文法的FIRST集

求文法的FIRST集和FOLLOW集的步骤如下: 求FIRST集 如果符号是终结符,则FIRST集合为该终结符本身。如果符号是非终结符,则将该非终结符可以推导出的所有串的FIRST集合合并,得到该非终结符的FIRST集合。如果一个非终结符可以推导出…

Linux篇5

Shell常用命令 1. 磁盘管理类1.1 du:查看文件和目录占用的磁盘空间1.2 df:查看磁盘空间使用情况1.3 free:查看内存使用情况1.4 lsblk:查看设备挂载情况1.5 mount/umount:挂载/卸载1.6 fdisk:分区 2. 进程管…

双模齐下,提质增效:CODING 携手知微共创 BizDevOps 体系新篇章

为了提升工作和管理效率,工具建设是许多企业不得不面对的现实,然而在工具建设落地过程中,往往存在一系列的问题。如不同组织、部门之间互不相通,各自为政,工具流程与实际工作所需不符,导致工具建设的结果是…

(1分钟速览)g2o入门指南--笔记版

在slam后端中,优化的框架很多,有ceres,g2o,gtsam这些。要想真正掌握slam后端的优化内容,这些框架是必不可少的上手练习的内容。本文则介绍有关g2o的相关内容,作为一个入门指南,目标:…

使用教程 | 基于TSMaster如何实现LIN RBS 剩余总线仿真

本文导读 RBS 全称是:residual bus simulation,也就是所谓的剩余总线仿真。主要是基于车载网络数据库,如 CAN/LIN/FlexRay/以太网数据库,仿真该网络内部各个节点的通讯行为。 本文主要讲解 TSMaster 中 LIN RBS 的操作流程。 “ …