pg事务:子事务

news2024/12/23 7:25:09

什么是子事务?

一般事务只能整体提交或回滚,而子事务允许部分事务回滚。

SAVEPOINT p1 在事务里面打上保存点标记。不能直接提交子事务,子事务也是通过事务的提交而提交。不过可以通过ROLLBACK TO SAVEPOINT p1回滚到该保存点。

子事务在大批量数据写入的时候很有用。如果事务中存在多个子事务,而其中一小段子事务失败,只需要重做这小部分数据就行,而不需要整个事务数据全部重做。

子事务在SQL语句中的使用

SAVEPOINT savepoint_name
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name
RELEASE [ SAVEPOINT ] savepoint_name

注意:

  • savepoints语句必须在事务块中
  • savepoint执行保存点;rollback回滚到指定保存点;release擦除保存点,不会回滚子事务数据
  • cursor不会被savepoint事务影响

sql中的子事务示例:

lzldb=# begin;
BEGIN
lzldb=*#  insert into lzl1 values(0);
INSERT 0 1
lzldb=*# savepoint p1;
SAVEPOINT
lzldb=*#  insert into lzl1 values(1);
INSERT 0 1
lzldb=*# savepoint p2;
SAVEPOINT
lzldb=*# insert into lzl1 values(2);
INSERT 0 1
lzldb=*# savepoint p3;
SAVEPOINT
lzldb=*# insert into lzl1 values(3);
INSERT 0 1
lzldb=*# rollback to savepoint p2;
ROLLBACK
lzldb=*# commit;
COMMIT
lzldb=# select xmin,xmax,cmin,a from lzl1;
 xmin | xmax | cmin | a 
------+------+------+---
  731 |    0 |    0 | 0
  732 |    0 |    1 | 1
(2 rows)
--回滚到p2时,p3也被回滚

lzldb=# select * from vlzl1;
 t_ctid | lp | lp_flags  | t_xmin | t_xmax | t_cid |                      raw_flags                       | combined_flags 
--------+----+-----------+--------+--------+-------+------------------------------------------------------+----------------
 (0,1)  |  1 | LP_NORMAL |    731 |      0 |     0 | {HEAP_HASNULL,HEAP_XMIN_COMMITTED,HEAP_XMAX_INVALID} | {}
 (0,2)  |  2 | LP_NORMAL |    732 |      0 |     1 | {HEAP_HASNULL,HEAP_XMIN_COMMITTED,HEAP_XMAX_INVALID} | {}
 (0,3)  |  3 | LP_NORMAL |    733 |      0 |     2 | {HEAP_HASNULL,HEAP_XMIN_INVALID,HEAP_XMAX_INVALID}   | {}
 (0,4)  |  4 | LP_NORMAL |    734 |      0 |     3 | {HEAP_HASNULL,HEAP_XMIN_INVALID,HEAP_XMAX_INVALID}   | {}
(4 rows)
--子事务infomask跟一般事务区别不大,同一个事务中多个命令通过cid和HEAP_XMIN_INVALID等就可以判断可见性
--子事务产生写入同样会消耗transaction id,而且cid在父事务框架下增加

其他场景中产生子事务

即使不用savepoint,也有其他方法产生子事务

  • EXCEPTION语句会触发子事务,这在一些工具或架构中常见,也很容易被忽略。每次EXCEPTION都会产生一个子事务。

语法如:BEGIN / EXCEPTION WHEN .. / END

参考:https://fluca1978.github.io/2020/02/05/PLPGSQLExceptions.html

  • PL/Python代码引用plpy.subtransaction()

子事务SLRU缓存

子事务提交日志在pg_xact,父子对应关系在pg_subtrans存储子事务缓存subXID和父XID的映射。当PostgreSQL需要查找subXID时,它会计算这个ID驻留在哪个内存页中,然后在内存页中进行搜索。如果页面不在缓存中,它会驱逐一个页面,并将所需的页面从pg_subtrans加载到内存中。大量的子事务cache miss会消耗系统的IO和cpu。

子事务用的buffer只有32个并在源码中写死

源码src/include/access/subtrans.h

/* Number of SLRU buffers to use for subtrans */
\#define NUM_SUBTRANS_BUFFERS    32

buffer默认为8k,xid是32位占4个bytes,所以

SUBTRANS_BUFFER大小为32*8k=256k

SUBTRANS_BUFFER能存储最多32*8k/4=65536个xid

在这里插入图片描述

通过transactionid找到子事务的在page中的位置
源码src/backend/access/transam/subtrans.c

/* We need four bytes per xact */
#define SUBTRANS_XACTS_PER_PAGE (BLCKSZ / sizeof(TransactionId))
//每个页面最多存储8k/4bytes=2048个子事务id

#define TransactionIdToPage(xid) ((xid) / (TransactionId) SUBTRANS_XACTS_PER_PAGE)
//通过子事务xid计算page号=xid/2048
#define TransactionIdToEntry(xid) ((xid) % (TransactionId) SUBTRANS_XACTS_PER_PAGE)
//通过子事务xid计算在page中的offset=xid%2048

子事务xid在page中不一定是紧凑的,一个page可能少于2048个子事务id

子事务的危害

  1. PGPROC_MAX_CACHED_SUBXIDS溢出

PGPROC_MAX_CACHED_SUBXIDS不是GUI参数,在源码中写死,只能通过改源码修改该参数。

源码src/include/storage/proc.h

	/* 
	*每个backend都有子事务cache上限PGPROC_MAX_CACHED_SUBXIDS。
	*我们必须跟踪cache是否溢出(比如,事务至少有一个缓存不了的子事务)
	*如果一个cache都没有溢出,我们可以确认没有在pgproc array中xid一定不是一个运行中的事务。
	*(没有在任何proc,又没有溢出,说明没有跑)
	*如果有溢出,我们必须查看pg_subtrans
	*/
	#define PGPROC_MAX_CACHED_SUBXIDS 64	/* XXX guessed-at value */
	
	struct XidCache
	{
		TransactionId xids[PGPROC_MAX_CACHED_SUBXIDS];
	};

阅读这段源码,得到两个重要信息

  • 每个backend都有子事务cache为PGPROC_MAX_CACHED_SUBXIDS,固定64个子事务
  • 超过64个子事务会溢出到pg_subtrans目录

copy大佬压测:子事务刚好超过64个的时候,性能下降。所以,每个会话的子事务最好不要超过64个

在这里插入图片描述

  1. 子事务导致multixact异常等待

原文:https://buttondown.email/nelhage/archive/notes-on-some-postgresql-implementation-details/

for update本身是行级排他锁,本身不应该产生multixact id,但在此场景中产生了多个MultiXact等待,导致数据库性能断崖

  • LWLock:MultiXactMemberControlLock
  • LWLock:MultiXactOffsetControlLock
  • LWLock:multixact_member
  • LwLock:multixact_offset

后来发现在Django框架中有子事务语句

SELECT [some row] FOR UPDATE;
 SAVEPOINT save;
 UPDATE [the same row];
  1. 从库性能急剧下降

原文:https://about.gitlab.com/blog/2021/09/29/why-we-spent-the-last-month-eliminating-postgresql-subtransactions/

一个长事务和一个savepoint子事务也可能造成查询库性能断崖

如果读取发生在主库的快照上,则生成的快照包含xmin,xmax,txip事务列表,subxip保存一个在进行的子事务列表。但是,无论是原数组还是快照都不会直接与从库共享,从库从WAL中读取所需的所有数据

在这里插入图片描述

当存在子事务时,一个长事务的运行会使从库性能断崖式下滑

在这里插入图片描述

  1. 生产性能急剧下降

当数据库运行繁忙,又存在较多子事务时,性能可能急剧下降,并伴随子事务的等待事件。这个场景即使每个会话子事务没有超过64,而且不是在从库而是在主库上时,也会发生。

我们发现工具(OGG)中默认是50个子事务,此时我们将工具中的子事务数据量降低到10-20个时,数据库性能得到缓解。

子事务的使用建议

  • 除了显示savepoint使用子事务,excetpion、框架、工具中同样会产生子事务
  • 如果有从库查询业务,禁止使用子事务。
  • 谨慎使用行锁。for update+子事务同样会引起multixactid的问题
  • 如果仍有子事务,子事务设置不要超过64个,最好是更低

子事务已经在国内外生产环境造成了非常多问题,有许多案例和问题分析。引用一下“Subtransactions are basically cursed. Rip em out.”

子事务参考

https://postgres.ai/blog/20210831-postgresql-subtransactions-considered-harmful

https://www.cybertec-postgresql.com/en/subtransactions-and-performance-in-postgresql/

https://fluca1978.github.io/2020/02/05/PLPGSQLExceptions.html

https://about.gitlab.com/blog/2021/09/29/why-we-spent-the-last-month-eliminating-postgresql-subtransactions/

https://buttondown.email/nelhage/archive/notes-on-some-postgresql-implementation-details/

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

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

相关文章

人工智能基础部分19-强化学习的原理和简单应用,一看就懂

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分19-强化学习的原理和简单应用,随着人工智能的不断发展,各种新兴技术不断涌现。作为人工智能的一个重要分支,强化学习近年来受到了广泛关注。本文将介绍强化学习的…

基于C++的物资管理系统的设计与实现

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 一 需求分析 程序需实现以下功能: 新物资信息录入(编号、名称、库存) 查询已录入的所有物资信息(编号或名称为索引) 添加物资信息(编号或名称为索引&…

Python 初识基础

Python 初识基础 一、Python 变量定义使用二、Python 是弱类型的语言三、Python 注释四、Python 编码规范五、Python 标识命名规格六、Python 保留字表七、Python 内置函数表 一、Python 变量定义使用 声明:变量名 value值1、变量的值不是一成不变的,它…

成为顶级黑客:从零开始学习网络渗透的完整指南

前言 网络安全再进一步细分,还可以划分为:网络渗透、逆向分析、漏洞攻击、内核安全、移动安全、破解PWN等众多子方向。今天的这篇,主要针对网络渗透方向,也就是大家所熟知的“黑客”的主要技术,其他方向仅供参考&…

计算机视觉 YOLOv5_3.1实验记录

YOLOv5_3.1 I. 散点图II. 指标III. precision-recall_curveIV. labelsv. 可视化 I. 散点图 这些参数通常用于目标检测模型的评估。其中: Box表示目标检测模型检测出的所有边界框的数量;val Box表示用于验证检测模型性能的边界框数量;Objectn…

国内IEEEXplore访问加速(adblock)

访问IEEEXplore,需要加载一个网页需要等好久,然后才出来,就很奇怪,查到网上有同样这个问题 感谢原博主:ieeexplore加载慢的解决办法 核心原因: 国内无法访问地址: https://cdn.jwplayer.com/…

Docker搭建企业邮箱,poste.io教程

poste.io介绍 首先要知道,搭建企业邮箱即可拥有自己的域名后缀邮箱,自定义邮件地址,什么admin,root,info都是随便用的。Poste.io官网:https://poste.io/ 文档:https://poste.io/doc/ Poste.io…

洛谷P1618

一、问题引出 三连击(升级版) 题目描述 将 1 , 2 , … , 9 1, 2,\ldots, 9 1,2,…,9 共 9 9 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A : B : C A:B:C A:B:C,试求出所有满足条件的三个三位…

声音好听,颜值能打,基于PaddleGAN给人工智能AI语音模型配上动态画面(Python3.10)

借助So-vits我们可以自己训练五花八门的音色模型,然后复刻想要欣赏的任意歌曲,实现点歌自由,但有时候却又总觉得少了点什么,没错,缺少了画面,只闻其声,却不见其人,本次我们让AI川普的…

Linux软件包管理器yum

Linux软件包管理器yum 一.什么是安装包二.关于rese1.windows传到Linux2.linux到windows 三.安装四.卸载五.yum扩展源六.一些好玩的软件1.第一个2.第二个 一.什么是安装包 1.在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 2.但是这样太麻…

阿里云服务器ECS是什么?详细介绍

阿里云服务器ECS是什么?云服务器和传统的物理服务器有什么区别?云服务器有哪些优势?云服务器可以什么?云服务器架构及云服务器包含哪些功能组件?阿里云百科来详细说下什么是云服务器ECS: 目录 阿里云服务…

Python+Selenium教程

PythonSelenium教程 准备工作1.安装selenium2.下载浏览器驱动3.测试执行 元素定位控制浏览器操作控制浏览器窗口大小浏览器后退前进浏览器刷新 Webelement常用方法点击和输入提交其他 鼠标操作键盘操作获取断言信息等待页面加载完成显示等待隐式等待 Selenium是一个用电脑模拟人…

验证知识点总结

1、常用总线对比 AMBA (Advanced Microcontroller Bus Architecture) 高级处理器总线架构 AHB (Advanced High-performance Bus) 高级高性能总线 ASB (Advanced System Bus) 高级系统总线 APB (Advanced Peripheral Bus) 高级外围总线 AXI (Advanced eXtensible Interface) 高…

521之虚拟女友-程序猿的你不认领一个?

520已经来了,你准备好迎接这一浪漫的日子了吗? 作为知否AI问答向你推荐一个值得期待的礼物——知否AI虚拟女友。目前人们对虚拟女友的需求越来越高,而知否AI虚拟女友正是满足这一需求的最佳选择。 01 — 知否AI虚拟女友 作为一款基于ChatG…

Compose For Desktop 实践:使用 Compose-jb 做一个时间水印助手

前言 在我之前的文章 在安卓中实现读取Exif获取照片拍摄日期后以水印文字形式添加到照片上 中,我们已经实现了在安卓端读取 Exif 信息后添加文字水印到图片上。 也正如我在这篇文章中所说的,其实这个需求使用手机来实现是非常不合理的,一般…

CPU和显卡才是最抗热的?

高温是电脑蓝屏和掉帧的罪魁祸首,虽然硬件有了保护不会因为高温烧坏,但当你的工作进行到一半时突然蓝屏,或是游戏中的关键时刻突然掉帧,你的内心肯定是崩溃的,那么电脑中的硬件温度应该控制在多少度呢? 首先…

二进制部署高可用Kubernetes集群 (成功) 看报错

SUMMARY 参考网上的教程和网课,进行二进制高可用Kubernetes部署。并对整个过程和报错进行简单记录。 架构图 设备规划 序号名字功能VMNET 1备注 1备注 2备注 3 备注 4备注 50orgin界面192.168.164.10haproxykeepalived192.168.164.2001reporsitory仓库192.168.1…

〖大学生·技术人必学的职业规划白宝书 - 优质简历篇②〗- 面试官所青睐的优秀简历是什么样的?

历时18个月,采访 850 得到的需求。 不管你是在校大学生、研究生、还是在职的小伙伴,该专栏有你想要的职业规划、简历、面试的答案。说明:该文属于 大学生技术人职业规划白宝书 专栏,购买任意白宝书体系化专栏可加入TFS-CLUB 私域社…

【OpenCv • c++】形态学技术操作 —— 顶帽操作与黑帽操作

🚀 个人简介:CSDN「博客新星」TOP 10 , C/C 领域新星创作者💟 作 者:锡兰_CC ❣️📝 专 栏:【OpenCV • c】计算机视觉🌈 若有帮助,还请关注➕点赞➕收藏&#xff…

Ae 入门系列之十一:抠像

抠像,英文为 Keying,故也被称为“键控”。在早期电视节目制作中,意思是吸取画面中的某一颜色并使得此颜色相关区域成为透明,从而保留所需要的内容。 我们通常称要抠出(要保留)的主体为前景 Foreground&…