postgressql——事务提交会通过delayChkpt阻塞checkpoint(9)

事务提交会通过delayChkpt阻塞checkpoint

Postgresql事务在事务提交时(执行commit的最后阶段)会通过加锁阻塞checkpoint的执行,尽管时间非常短,分析为什么需要这样做:

首先看提交堆栈

#1  0x0000000000539175 in CommitTransaction () at xact.c:2079
#2  0x0000000000539e04 in CommitTransactionCommand () at xact.c:2824
#3  0x000000000087d1ea in finish_xact_command () at postgres.c:2482
#4  0x000000000087af27 in exec_simple_query (query_string=0x24050e0 "insert into t1 values (1,1);") at postgres.c:1154

函数调用过程

关键函数如下:

CommitTransaction...latestXid = RecordTransactionCommit();...BufmgrCommit()START_CRIT_SECTION()【关键流程】END_CRIT_SECTION()latestXid = TransactionIdLatest(xid, nchildren, children);SyncRepWaitForLSN(XactLastRecEnd, true);return latestXid;...ProcArrayEndTransaction(MyProc, latestXid);...// clean ...

关键流程

delayChkpt阻塞checkpoint发生位置:

  1. 事务提交配置delayChkpt
RecordTransactionCommit...START_CRIT_SECTION();MyPgXact->delayChkpt = true;/* 写XLOG:COMMIT *//* 写CLOG:内存写不刷盘 */MyPgXact->delayChkpt = false;...
  1. CreateCheckPoint等待delayChkpt
    联动CreateCheckPoint,会在【2】等在所有Xact的delayChkpt为false才能继续
CreateCheckPoint// 【1】计算位置(重要)WALInsertLockAcquireExclusive();curInsert = XLogBytePosToRecPtr(Insert->CurrBytePos);freespace = INSERT_FREESPACE(curInsert);if (freespace == 0){if (curInsert % XLogSegSize == 0)curInsert += SizeOfXLogLongPHD;elsecurInsert += SizeOfXLogShortPHD;}checkPoint.redo = curInsert;RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo;WALInsertLockRelease();// 【2】通过delayChkpt等其他所有正在提交中、正在写日志的事务vxids = GetVirtualXIDsDelayingChkpt(&nvxids);if (nvxids > 0){do{pg_usleep(10000L);	/* wait for 10 msec */} while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids));}pfree(vxids);// 【3】刷数据CheckPointGuts(checkPoint.redo, flags);// 【4】记chkpt日志XLogBeginInsert();XLogRegisterData((char *) (&checkPoint), sizeof(checkPoint));recptr = XLogInsert(RM_XLOG_ID,shutdown ? XLOG_CHECKPOINT_SHUTDOWN :XLOG_CHECKPOINT_ONLINE);XLogFlush(recptr);

为什么checkpoint需要等事务提交

确定REDO位点是在createCheckpoint的函数前面执行的,checkpoint和事务提交并发会有下面三种情况发生(假设没有delayChkpt会有情况二发生)
在这里插入图片描述
情况一:redo point在commit提交前,那么如果crash发生了,redo过程会覆盖这条xlog,不会有问题

情况二:如果没有delayChkpt,redo point可能发生在上图中的位置(然后checkpoint刷完数据后,当前事务才写clog),XLOG已经先写了,如果crash发生了,redo过程不会覆盖这条xlog,而且clog信息不存在,那么commit信息彻底丢掉了。

情况三:redo point在事务提交后,redo时xlog虽然还是做不到,但是clog一定会被刷下去,所以我们不会丢失事务提交信息。

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

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

相关文章

Django表单革命:打造安全、高效、用户友好的Web应用

Django表单处理,听起来是不是有点枯燥?别急,阿佑将带你领略Django表单的艺术之美。我们将以轻松幽默的语言,一步步引导你从表单的创建到管理,再到验证和自定义,让你在不知不觉中掌握Django表单的精髓。文章…

支付宝支付(沙盒支付)

后端页面代码 Controller RequestMapping("/pay") public class PayController {private String orderId;Autowiredprivate OrdersService ordersService;Value("${appId}")private String appId;Value("${privateKey}")private String private…

奇安信 网神SecGate 3600防火墙 (相关问题整理)

本文所有问题,基于实际项目中出的问题,设备:网神SecGate 3600防火墙 会话记录 数据中心>会话>会话监控,终端发起SYN请求,就能看到记录,无需完全建立TCP连接 默认安全策略 防火墙的安全策略中&…

CAD二次开发(7)- 实现Ribbon选项卡,面板,功能按钮的添加

1. 创建工程 2. 需要引入的依赖 如图,去掉依赖复制到本地 3. 代码实现 RibbonTool.cs 实现添加Ribbon选项卡,添加面板,以及给面板添加下拉组合按钮。 using Autodesk.Windows; using System; using System.Collections.Generic; using S…

Ubuntu18.04安装pwntools报错解决方案

报错1:ModuleNotFoundError: No module named ‘setuptools_rust’ 报错信息显示ModuleNotFoundError: No module named setuptools_rust,如下图所示 解决方案:pip install setuptools_rust 报错2:pip版本低 解决方案&#xff…

天气数据集-Jena Climate dataset

天气数据集-Jena Climate dataset 1.数据集基本信息 Dataset Name: mpi_saale_2021b.csv Size: 26495 rows; 1 year (2021), 10 min 气象学、农业、环境科学 开源机构: Max Planck Institute for Biogeochemistry 2.数据特征 2.1 特征简介 数据共有31个特征,…

LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点

本文探讨了LabVIEW与欧陆温控表通讯的具体实现方法,并对比了使用厂商提供的软件与自行开发LabVIEW程序的优缺点。通过综合分析,帮助用户在实际应用中选择最适合的方案,实现高效、灵活的温控系统。 LabVIEW与欧陆温控表通讯的实现与应用&#…

派生类中调用基类的__init__()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在派生类中定义__init__()方法时,不会自动调用基类的__init__()方法。例如,定义一个Fruit类,在__init__()方法中创…

通过非欧几何体改变 AI 嵌入

目录 一、说明 二、LLM嵌入的形势 三、了解一些背景信息 3.1 什么是嵌入? 3.2 为什么嵌入在 NLP 中很重要? 3.3 复数Complex 几何的角色 3.4 C主动学习 3.5 角度嵌入 (AE):解锁稳健排序 3.6 RotatE:将关系…

day-37 最大正方形

思路 动态规划,这题主要得弄明白状态转换方程,dp[i][j]表示以(i,j)为右下角的最大正方形 解题方法 1.首先将第一行和第一列初始化,当对应位置的matrix为’0’时,dp数组对应位置也为零,否则为1 …

【工具】探索 DOU:每用户数据使用量

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 🎵 邓紫棋《光年之外》 什么是 DOU…

重学java 55. 集合 Set接口

我救自己万万次,铮铮劲草,绝不动摇 —— 24.6.2 一、Set集合介绍 Set和Map密切相关的 Map的遍历需要先变成单列集合,只能变成set集合 二、HashSet集合的介绍和使用 1.概述 HashSet是Set接口的实现类 2.特点 a、元素唯一 b、元素无序 c、无索引…

开源VS闭源:大模型之争,究竟谁更胜一筹?

随着人工智能技术的快速发展,大模型作为其中的核心组件,已经引起了业界的广泛关注。在大模型的研发过程中,开源与闭源成为了两个备受争议的话题。究竟开源与闭源谁更好?本文将从多个角度进行深入分析,为大家揭示真相。…

重载运算符C++---学习笔记

一、笔记 1. 重载运算符基础知识 重载运算符进行的运算和普通数的加减运算不同之处在于重载运算符的操作数为一个一个自定义的对象,所以相应的要对普通的运算符如-*%/的调用方法进行重写,重载的本质还是函数调用 2. 重载运算符的语法 重载运算符的语…

Kubernetes-使用集群CA证书给用户颁发客户端证书访问Api-Server

一、官网地址 证书和证书签名请求 | Kubernetes 二、Demo 一、创建测试文件夹 cd ~ mkdir add_k8s_user_demo cd add_k8s_user_demo 二、创建符合X509标准的证书 openssl genrsa -out myuser.key 2048 openssl req -new -key myuser.key -out myuser.csr -subj "/CNmy…

自动微分技术在 AI for science 中的应用

本文简记我在学习自动微分相关技术时遇到的知识点。 反向传播和自动微分 以 NN 为代表的深度学习技术展现出了强大的参数拟合能力,人们通过堆叠固定的 layer 就能轻松设计出满足要求的参数拟合器。 例如,大部分图神经网络均基于消息传递的架构。在推理…

带交互的卡尔曼滤滤波|一维滤波|源代码

背景 一维卡尔曼滤波的MATLAB例程,​背景为温度估计。 代码介绍 运行程序后,可以自己输入温度真实值: 以20℃为例,得到如下的估计值​: 滤波前的值和滤波后的值分别于期望值(真实值)作差…

基于Jenkins+Kubernetes+GitLab+Harbor构建CICD平台

1. 实验环境 1.1 k8s环境 1)Kubernetes 集群版本是 1.20.6 2)k8s控制节点: IP:192.168.140.130 主机名:k8s-master 配置:4C6G 3)k8s工作节点 节点1: IP:192.1…

【机器学习】基于OpenCV和TensorFlow的MobileNetV2模型的物种识别与个体相似度分析

在计算机视觉领域,物种识别和图像相似度比较是两个重要的研究方向。本文通过结合深度学习和图像处理技术,基于OpenCV和TensorFlow的MobileNetV2的预训练模型模,实现物种识别和个体相似度分析。本文详细介绍该实验过程并提供相关代码。 一、名…

JVM运行时数据区 - 程序计数器

运行时数据区 Java虚拟机在执行Java程序的过程中,会把它管理的内存划分成若干个不同的区域,这些区域有各自的用途、创建及销毁时间,有些区域随着虚拟机的启动一直存在,有些区域则随着用户线程的启动和结束而建立和销毁&#xff0…