海山数据库(He3DB)源码详解:AbortTransaction函数

STM32单片机入门学习(六)-光敏传感器控制LED 光敏传感模块一DO端接B13,GND接GND,VCC接VCC,AO不接。LED负极接B12,正极接VCC。 阅读详情

海山数据库(He3DB)源码详解:AbortTransaction函数

本文介绍了事务提交过程中,具体执行提交任务的AbortTransaction函数详细执行流程。

1. 执行条件

存在三种调用此函数的场景:

  1. SQL语法出错,由sigsetjmp函数跳回PostgresMain函数,从AbortCurrentTransaction函数中调用AbortTransaction函数。
  2. 事务执行过程中出错,跳出执行AbortTransaction函数。
  3. 主动放弃事务,执行AbortTransaction函数。

2. 执行过程

2.1 获取当前状态:

申请事务状态变量TransactionState s和并创建两个临时变量latestXid和is_parallel_worker。

将CurrentTransactionState变量赋值给TransactionState s。

TransactionState s = CurrentTransactionState;
TransactionId latestXid;
bool		is_parallel_worker;

2.2 开始事务资源清理:

关闭中断开始清理工作。

    /* Prevent cancel/die interrupt while cleaning up */
    HOLD_INTERRUPTS();

切换事务上下文和资源拥有者。

    /* Make sure we have a valid memory context and resource owner */
    AtAbort_Memory();
    AtAbort_ResourceOwner();
  1. AtAbort_Memory()负责切换事务上下文到TransactionAbortContext,如果这个上下文没有足够的空间就切换到TopMemoryContext。
  2. 因为Abort的操作肯定是从top开始,AtAbort_ResourceOwner负责将TopTransactionResourceOwner切换到CurrentResourceOwner 。

释放所有LW锁,清除等待信息和命令进度指示器。

    LWLockReleaseAll();
    /* Clear wait information and command progress indicator */
    pgstat_report_wait_end();
    pgstat_progress_end_command();

事务在Abort之前可能会遇到各种需要等待的情况,这些等待可能是由于资源争用、锁、系统限制或其他原因造成的,因此:

  1. 调用LWLockReleaseAll()函数释放所有LW锁,需要释放LW锁;
  2. 调用pgstat_report_wait_end()函数,需要pgstat_report_wait_end()通知数据库后台事务等待结束;
  3. 调用pgstat_progress_end_command()函数,需要pgstat_progress_end_command()通知数据库后台结束对当前事务进度的报告。

清除I/O和缓存相关的资源。

    /* Clean up buffer I/O and buffer context locks, too */
    AbortBufferIO();
    UnlockBuffers();

AbortBufferIO()的作用主要是在事务中止(Abort)时进行相关的清理工作。

  1. 中断 I/O 操作:如果事务在中止时有正在进行的 I/O 操作,AbortBufferIO 会尝试中断这些操作,以确保不会有数据被错误地写入磁盘。
  2. 清除缓冲区标记:事务可能会标记缓冲区为“脏”(即已修改),表示这些缓冲区的数据已经被更改,需要被刷新到磁盘。AbortBufferIO 会清除这些标记,因为中止的事务不会将更改永久化。
  3. UnlockBuffers()主要作用是在事务结束时释放事务过程中所持有的缓冲区锁,以及清理固定计数(PIN COUNT)
  4. 固定(Pinning)一个缓冲区意味着告诉系统在某些操作完成之前不要释放该缓冲区,因此,即使锁已经被释放,缓冲区仍然处于被固定状态,不能被操作。

重置WAL记录的构造状态。

    /* Reset WAL record construction state */
    XLogResetInsertion();

XLogResetInsertion()的作用是重置WAL记录的构造状态。重置插入状态意味着清除当前事务对WAL日志记录的所有影响,撤销任何未完成的 WAL 记录构造,确保 WAL 日志的整洁和正确性。具体的来说:

  1. 清除当前事务可能已经开始构建但未完成的WAL记录;
  2. 撤销对WAL缓冲区的任何修改,这些修改可能是由于事务中的操作而进行的;
  3. 确保在事务失败或需要回滚时,不会有部分完成的WAL记录留在系统中。

清理任何未完成的条件等待睡眠。

    /* Cancel condition variable sleep */
    ConditionVariableCancelSleep();

ConditionVariableCancelSleep()的作用是取消睡眠状态,将当前线程的等待状态从条件变量的等待队列中移除,如果线程没有处于睡眠状态(等待条件变量),则什么都不做。

取消所有挂起的锁等待要求并撤销进行中的强锁计数获取。

    LockErrorCleanup();
  1. LockErrorCleanup()主要作用:在事务中止时取消所有挂起的锁等待请求。挂起的锁等待指的是,某些操作因为等待锁的释放而被阻塞。比如,查询操作对数据的读取,创建一个索引的操作。
  2. LockErrorCleanup()还会撤销(revert)任何正在进行中的强锁计数获取。在 PostgreSQL 中,锁有一个计数机制,用于跟踪同一锁被请求的次数。如果事务在获取锁的过程中被中止,需要确保相关的锁计数被恢复到正确的状态。

重新安排超时事件。

	reschedule_timeouts();

reschedule_timeouts()的作用是重新安排超时事件。

  1. 如果存在任何仍然处于活动状态的超时事件,该函数确保已经安排了超时中断。在清理锁错误之后,系统会检查是否有任何超时事件仍然需要处理,并确保相应的超时中断被重新安排。
  2. 这样做可以防止由于异常退出信号处理器而导致的超时中断丢失,并避免重新安排锁或死锁的超时检查。

重新启用(解除屏蔽)信号。

	PG_SETMASK(&UnBlockSig);
  1. PG_SETMASK 宏或函数的作用是重新启用(解除屏蔽)信号。这是为了处理一种特定情况:程序可能通过 longjmp 函数从信号处理器(signal handler)中跳出。
  2. 在 C 语言中,longjmp 可以跳出最近的 setjmp 调用,通常用于异常处理或从信号处理器中恢复执行。如果程序通过这种方式跳出信号处理器,可能需要重新启用之前被屏蔽的信号。

设置用户ID和安全上下文。

	SetUserIdAndSecContext(s->prevUser, s->prevSecContext);

为了确保用户ID可能因为某些操作的临时改变能够被正确处理,调用SecurityRestrictionContext函数保存prior的ID和安全上下文,在恢复时能够恢复到一个正确的状态。

重置REINDEX状态、逻辑流复制状态和快照状态。

	/* Forget about any active REINDEX. */
	ResetReindexState(s->nestingLevel);
	/* Reset logical streaming state. */
	ResetLogicalStreamingState();
	/* Reset snapshot export state. */
	SnapBuildResetExportedSnapshotState();
  1. ResetReindexState用于重置当前会话或事务的REINDEX状态,取消或撤销任何当前处于活动状态的REINDEX操作。REINDEX是PostgreSQL中用来重建索引的命令,它可能会改变数据库的索引结构和统计信息。
  2. ResetLogicalStreamingState函数的作用是重置逻辑流复制的状态。CheckXidAlive = InvalidTransactionId; bsysscan = false;
  3. SnapBuildResetExportedSnapshotState函数的作用是重置由快照构建器(snapshot builder)导出的快照状态。在 PostgreSQL 中,快照是数据库在某一时刻的状态的视图,可以用于复制、备份或其他数据库维护任务。

执行事务放弃过程。

	/*
	 * do abort processing
	 */
	AfterTriggerEndXact(false); /* 'false' means it's abort */
	AtAbort_Portals();
	smgrDoPendingSyncs(false, is_parallel_worker);
	AtEOXact_LargeObject(false);
	AtAbort_Notify();
	AtEOXact_RelationMap(false, is_parallel_worker);
	AtAbort_Twophase();
  1. AfterTriggerEndXact(false)表示处理事务结束时的后触发器的函数,它接受一个布尔参数isCommit,该参数指示事务是提交 (true) 还是回滚 (false)。

    如果事务中有未触发的触发器,它们将被取消,并且与这些触发器相关的任何信息或状态都将被丢弃。在事务结束时,不需要执行这些未触发的触发器,也不需要保留它们的任何状态信息。

  2. AtAbort_Portals 函数的作用是在事务中止时对门户(Portals)进行清理中止处理。门户是存储的游标,它们可以包含复杂的查询和状态信息。当事务中止时,需要清理门户以释放资源并确保不会留下任何未完成的操作。

  3. smgrDoPendingSyncs函数会在当前事务期间,对那些被创建且其更改没有记录在 WAL(Write-Ahead Logging)日志中的文件进行同步。这是为了确保如果发生崩溃,这些文件的状态是一致的,并且不会留下已提交但损坏的文件。

  4. AtEOXact_LargeObject函数主要是清理一些超出常规字段所能存储限制的“大对象”,关闭与大型对象关联的文件描述符(LO fds),并清空 cookie 数组。

    这样做的结果是,这些文件描述符将不再有效,无法再被用来访问或操作大型对象。无论事务是提交还是中止,持有这些 LO fds 的内存上下文和资源所有者在事务结束时都将被销毁。这意味着这些资源在事务结束时无论如何都会被清理。

    在事务提交的情况下,需要关闭这些 LO fds,以避免在提交时出现关于资源泄露的警告。这是因为在提交时,系统会检查所有资源是否已经被正确管理,包括打开的文件描述符。

    在事务中止的情况下,可以跳过关闭 LO fds 的步骤。这是因为在中止事务时,系统会回滚所有更改,并且通常不需要执行与提交相同的清理操作。

  5. AtAbort_Notify 函数的作用是清除所有挂起的操作和出站通知(outbound notifies)。这里的“挂起的操作”指的是在事务中计划执行但尚未执行的动作。“出站通知”可能指的是使用NOTIFY命令发送的信号,这些信号原本计划在事务提交时发送,以通知其他进程或应用程序有关事件的发生,但现在事务放弃了,就不发送NOTIFY命令通知其他程序,直接放弃。

  6. AtAbort_Twophase 函数的作用是在事务中止时解锁我们正在工作的全局事务条目。非分布式的事务中,全局变量MyLockedGxact为NULL,函数不做任何操作直接返回。如果存在2PC,根据事务中止时的不同情况,如何处理全局事务条目。这包括在某些情况下从共享内存中移除条目,以及在其他情况下保留并解锁条目,以允许事务稍后完成或正确结束。

清理GUC、SPI、HashTables等资源的占用。

		ResourceOwnerRelease(TopTransactionResourceOwner,
							 RESOURCE_RELEASE_BEFORE_LOCKS,
							 false, true);
		AtEOXact_Buffers(false);
		AtEOXact_RelationCache(false);
		AtEOXact_Inval(false);
		AtEOXact_MultiXact();
		ResourceOwnerRelease(TopTransactionResourceOwner,
							 RESOURCE_RELEASE_LOCKS,
							 false, true);
		ResourceOwnerRelease(TopTransactionResourceOwner,
							 RESOURCE_RELEASE_AFTER_LOCKS,
							 false, true);
		smgrDoPendingDeletes(false);

		AtEOXact_GUC(false, 1);
		AtEOXact_SPI(false);
		AtEOXact_Enum();
		AtEOXact_on_commit_actions(false);
		AtEOXact_Namespace(false, is_parallel_worker);
		AtEOXact_SMgr();
		AtEOXact_Files(false);
		AtEOXact_ComboCid();
		AtEOXact_HashTables(false);
		AtEOXact_PgStat(false, is_parallel_worker);
		AtEOXact_ApplyLauncher(false);
		pgstat_report_xact_timestamp(0);

具体可以参考CommitTransaction函数的清理过程。

2.3 完成事务资源清理

完成事务的放弃操作,恢复中断。

	/*
	 * State remains TRANS_ABORT until CleanupTransaction().
	 */
	RESUME_INTERRUPTS();

这里只是完成了放弃事务需要的资源清理工作,对事务的放弃完成需要执行CleanupTransaction()函数。

作者介绍

李超,移动云数据库工程师,负责云原生数据库He3DB的研发。

手把手教你学simulink实例--基于Simulink的船舶动力定位系统建模与仿真 船舶动力定位系统(Dynamic Positioning System, DPS)是一种通过控制推进器来保持船舶在指定位置和航向的技术。它广泛应用于海上钻井平台、海洋调查船、起重船等需要精确位置控制的场景。DPS的核心任务是实时感知环境干扰(如风、浪、流),并通过闭环控制算法调整推进器输出,以抵消外界扰动并维持船舶的位置和姿态。本项目旨在基于MATLAB/Simulink平台,构建船舶动力定位系统的数学模型,并进行仿真分析,验证其性能和稳定性。 阅读详情

相关推荐

《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》论文阅读笔记

文章名:《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》 作者Jiyao Wei a,1, Jian Liaoa,1, Zhenfei Yanga, Suge Wanga,b,∗, Qiang Zhaoa 年份 2019 1 Introduction 目前文本情感分析多分析带...

weixin_39036944的博客 1630

postgresql源码学习(六)—— 回滚(中止)与清理事务

一、 AbortTransaction 1. gdb测试 会话1 会话2 2. 具体代码与跟踪 调用栈如下 static void AbortTransaction(void) { TransactionState s = CurrentTransactionState; TransactionId latestXid; bool is_parallel_worker; /* Prevent cancel/die interrupt while cleani

Hehuyi_In的博客 4072

Typora绘制思维导图

我们观察一下,其实思维导图就是树状结构的数据嘛,作为程序员,拿语言写树状结构的数据是很平常的事情。而且写代码可比画图省事多了,查阅资料可以知道,有一种`mermaid`语法,就是做这件事情的,支持 UML,甘特图,流程图等。

Peter Cheung的博客 7933

TransactionScope TransactionAbortedException

今天在调试代码的时候遇到一个这样的错误: System.Transactions.TransactionAbortedException was caught HResult=-2146233087 Message=The transaction has aborted. Source=System.Transactions 查了一下原因,主要是由于嵌套事务中,底层事务没有关闭,然...

weixin_30379911的博客 934

基于STM32F407与AD9910/AD9959的高频可调DDS信号源设计与实战

本文详细介绍了基于STM32F407微控制器与AD9910/AD9959高性能DDS芯片的高频可调信号源设计与实现。文章从DDS原理入手,阐述了双芯片方案的优势,并重点分享了高频电路设计中的电源、PCB布局布线等关键硬件设计技巧与避坑指南。同时,提供了通过SPI配置DDS芯片及利用Matlab生成任意波形的软件驱动方法,旨在帮助开发者打造一个覆盖10Hz至4200MHz的实用信号发生器。

weixin_36184718的博客 120

HFSS线圈仿真避坑指南:从建模到寄生参数分析的完整流程

本文详细介绍了HFSS线圈仿真的完整流程,从精准建模到寄生参数优化,特别针对Ansys Electronics Desktop用户提供实用指南。涵盖线圈几何构建、材料属性配置、端口激励设置及寄生电阻与电感分析等关键步骤,帮助工程师避免常见错误,提升仿真精度与效率。

weixin_29209801的博客 548

海山数据库(He3DB)源码详解:CleanupTransaction函数源码详解

本文介绍了事务放弃过程中,释放资源并修改事务状态的函数CleanupTransaction执行流程。

weixin_51457815的博客 433

使用amp训练出现Detected call of lr_scheduler.step() before optimizer.step().

这个警告是怎么产生的?是由于在算梯度的时候出现了nan,所以这一次更新会跳过,但是参数仍旧会更新所以出现了问题,按下面的做法加一个判断就行了。但是在使用amp进行混合精度训练出现的一个warning,调换代码顺序也不work。正常在训练的时候,对于优化器和参数更新的顺序这样就可以了。

weixin_46214675的博客 1306

【Hive实战】Hive的事务表

Hive 事务表简介

有问题的请私信或关注v【技术印记】留言 3246

(SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验

(SEED-Lab)Buffer Overflow Vulnerability Lab 欢迎大家访问我的GitHub博客 https://lunan0320.cn 文章目录一、实验目的二、实验步骤与结果2.1 环境初始化2.2 Task1 运行shellcode2.3漏洞程序2.4 Task 22.5 Task 3: ASLR2.6 Task 4: Stack Guard2.7 Task 5:不可执行栈三、参考文献 一、实验目的 理解缓冲区溢出攻击的原理以及如何实施攻击 理解针对缓冲区溢出的防御措施

lunan的博客 8981

UMI——斯坦福刷盘机器人:通过手持夹爪革新数据收集方式,且使用视觉SLAM和Diffusion Policy预测动作

没想到今年年初的斯坦福mobilealoha的热度刚过,而到今年2月的下旬,斯坦福另一个团队又推出了UMI刷盘机器人,且这两个团队还互相认识、还在一块共同切磋(顺带小小感叹一下,斯坦福的氛围是真好而且真高产)斯坦福UMI刷盘机器人其与mobile aloha(以及AirExo: Low-Cost Exoskeletons for Learning Whole-Arm Manipulation in the Wild)最大的不同在于其收集数据处理的非真实的机器人,而是一个手持夹持器(从而大幅降低成本)

u013250861的博客 1357

mysql abort一个事务_mysql的事务transaction

事务具有四个特征ACID原子性(Atomicity),事务是最小单元,不可再分;一致性(Consistency),事务要求所有的DML语句操作的时候,必须保证同时成功或同时失败;隔离性(Isolation),一个事务不会影响其他事务的执行;持久性(Durability),在事务完成之后,该事务对数据库所作的更改将持久地保存在数据库中,并不会被回滚;MySQL事务的提交和回滚查看事务是否自动提交sh...

weixin_34732336的博客 558

AI赋能数字人:打造与语音节奏完美匹配的高质量手势动画

想象一个场景:当你与一位数字人交谈时,它不仅能理解你的言语,还能恰到好处地挥动手臂、比划手势,就像真实的人类交流一样自然流畅。这正是当前AI技术致力于实现的目标——通过分析语音内容,自动生成与之相匹配的手势动作,为数字人赋予更加丰富的情感表达和非言语沟通能力。AI手势生成技术的出现,标志着数字人在模仿人类自然交流方式上迈出了重要一步。随着技术的不断成熟与应用场景的拓宽,未来我们可以期待更多富有表现力和情感互动的数字人出现在我们的日常生活中,开启人机交互的新篇章。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 792

redis事务处理:(error) EXECABORT Transaction discarded because of previous errors.

4.1.2 错误处理 有些读者会有疑问,如果一个事务中的某个命令执行出错,Redis 会怎样处理呢?要回答这个问题,首先需要知道什么原因会导致命令执行出错。 (1)语法错误。语法错误指命令不存在或者命令参数的个数不对。比如: redis> MULTI  OK  redis> SET key value  QUEUED  redis> SET key  (error) ERR 

赶路人儿 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

第二章 SQL命令参考-ABORT

ABORT 中断当前的事务 概要 ABORT  [WORK | TRANSACTION] 描述 ABORT会将当前的事务进行回滚,使得这个事务发起的所有的更新都被忽略。这个命令和标准的SQL命令ROLLBACK的功能完全一样,之所以有这个命令是为了和历史进行兼容。参数 WORK TRANSACTION 备注: 使用COMMIT成功地结束一个事务。 在事务之外使用ABORT命令不

kygoal的博客 1599

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OnTransactionAbort对象

<%@ Transaction =REQUIRED %><%'说明该网页将以事务方式运行%><%Dim conn '定义变量Set conn=Server.CreateObject("Adodb.Connection") '创建Connection对象sql="Driver={Microsoft Access Driver...

weixin_34237596的博客 143

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 海山数据库(He3DB)源码详解:CommitTransaction函数源码详解
下一篇: 海山数据库(He3DB)源码解读:海山PG 虚拟文件描述符VFD
DAWN1221
博客等级 码龄7年 893粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值