PgSQL技术内幕 - ereport ERROR跳转机制

PgSQL技术内幕 - ereport ERROR跳转机制

使用客户端执行SQL的时候经常遇到报ERROR错误,然后SQL语句就退出了。当然,事务也会回滚掉。本文我们看下它是如何做到退出SQL语句并回滚事务的。

1、以insert一个numeric类型值为例

表一个字段为numeric(10,2)类型,表示存储10位数字,精确到小数点后两位。当插入的值超过10位时就会报错:numeric field overflow

首先观察报错的位置:

e7d3cc6309b593fc1a0241265d1a7232.png

由ereport输出打印日志。从函数ereport_domain函数的调用逻辑,如下图所示,可以看到通过siglongjmp函数进行跳转。

daa166336a7d5637fc7eb042e0cfffad.png

2、PG_TRY/PG_CATCH/PG_RE_THROW/PG_END_TRY

从上面可知,PG中通过PG_RE_THROW完成跳转,捕获ereport(ERROR)的API为:

PG_TRY();
{
  ... code that might throw ereport(ERROR) ...
}
PG_CATCH();
{
  ... error recovery code ...
}
PG_END_TRY();

该宏定义:

4622b076ea134d5c4460b58e6a58847c.png

sigsetjmp会保存目前堆栈环境,然后将目前的地址作为一个记号。程序其他地方调用siglongjmp时会直接跳到这个记号位置,然后还原堆栈,继续程序的执行。

3、整体逻辑

15d45f44b6ce6bf64ca6b66a256480d4.png

从PostgresMain接收命令ReadCommand到调用exec_simple_query执行SQL,然后standard_ExectorRun执行器开始执行;再到ExecModifyTable执行insert操作。首先,从子节点获取slot,然后执行ExecInsert执行插入操作。红色箭头为插入操作函数调用方向。

从子节点获取slot时,会调用apply_typmod函数校验numeric类型值是否会溢出。一旦溢出则报ereport ERROR。

蓝色箭头为跳转方向。从apply_typmod函数跳转到standard_ExecutorRun的PG_TRY位置,然后通过PG_CATCH处理一些清理操作,再由PG_RE_THROW跳转到exec_simple_query的PG_TRY位置,同理一直跳转到PostgresMain的sigsetjmp位置。

由此完成插入过程中报错退出动作,也就是说当ereport报ERROR时,并不是继续当前函数的退出逻辑,而是跳转到PostgresMain的sigsetjmp位置接着执行,继续一些清理操作,包括调用AbortCurrentTransaction回滚事务。

从上图中可以看到,回滚事务后会接着再次进入for循环,调用ReadCommand读取新命令执行,当然若没有命令到来,则进入等待。

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

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

相关文章

电脑报错“kernelbase.dll”文件缺失,软件游戏无法启动的解决方法

很多小伙伴留言说,每次自己要游戏或软件的时候,电脑就会弹出报错框,不知道应该怎么办? 其实,Windows报错提示已经说明了,程序找不到名为“kernelbase.dll”的文件,需要重新安装修复这个问题。 …

ssm基于JavaEE的智能实时疫情监管服务平台的设计与实现+jsp论文

摘 要 社会发展日新月异,用计算机应用实现数据管理功能已经算是很完善的了,但是随着移动互联网的到来,处理信息不再受制于地理位置的限制,处理信息及时高效,备受人们的喜爱。本次开发一套智能实时疫情监管服务平台有管…

C#中的Attribute详解(上)

C#中的Attribute详解(上) 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute,为了区分这四类静态方法,我们只能通过注释来说明,但这样做会给系统带来很多…

VD6283TX环境光传感器(2)----移植闪烁频率代码

VD6283TX环境光传感器----2.移植闪烁频率代码 闪烁定义视频教学样品申请源码下载参考代码硬件准备开发板设置生成STM32CUBEMX串口配置IIC配置X-CUBE-ALSADC使用定时器触发采样KEIL配置FFT代码配置app_x-cube-als.c需要添加函数演示结果 闪烁定义 光学闪烁是指人造光源产生的光…

极智嘉加快出海发展步伐,可靠产品方案获客户认可

2023年,国内本土企业加快出海征程,不少企业在出海发展中表现出了优越的集团实力与创新的产品优势,有力彰显了我国先进的科技研发实力。作为全球仓储机器人引领者,极智嘉(Geek)也在不断加快出海发展步伐&…

Talk | 北京大学博士生汪海洋:通向3D感知大模型的前置方案

本期为TechBeat人工智能社区第559期线上Talk。 北京时间12月28日(周四)20:00,北京大学博士生—汪海洋的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “通向3D感知大模型的前置方案”,介绍了他的团队在3D视觉大模型的前置方…

2023中国企业级存储市场:整体韧性成长,领域此消彼长

多年之后回头看,2023年也许是中国企业级存储市场标志性的一年。 后疫情时代的开启,中国数字经济快速发展、数据产业方兴未艾,为数据存储市场带来了前所未有的活力;与此同时,外部环境的不确定性骤增,人工智…

乘势而上开新年!2024深圳深圳户外家具及休闲用品展览会三月开幕

中国户外家具市场在九十年代末开始崭露头角,随着国家经济的腾飞,尤其是房地产行业的迅猛发展,加上现代商业模式的建立和完善,产品和需求都以惊人的速度在发展。无论是国际知名品牌,还是国内的专业户外家具生产企业&…

【开源学习】ThingsBoard -- 基本配置与使用

【开源学习】ThingsBoard -- 基本配置与使用 租户及客户管理租户及租户账号管理租户管理租户创建租户修改租户删除 租户账号管理租户账号创建租户账号修改租户账号删除 客户及客户账号管理客户管理客户创建客户修改客户删除 客户用户管理客户用户创建客户用户修改客户用户删除 …

进行VMware日志管理

随着公司转向虚拟化其 IT 空间,虚拟环境日志监控正在占据日志管理的很大一部分,除了确保网络安全外,虚拟机日志监控还有助于管理虚拟化工具,这是最复杂的任务之一。 对虚拟环境日志的监控分析 当今公司中最受欢迎的虚拟平台之一是 VMware。…

qml listview 刷新不及时问题

我在用qml listview 做界面, C 做model时, 往model中添加数据时, listview界面没有及时的更新 问题处理 发现 手动下拉或者上拉 listview界面会显示出来, 改变窗口的宽度也能显示出来 在model改变的时候 调用方法flick(…

【赠书第14期】AI短视频制作一本通:文本生成视频+图片生成视频+视频生成视频

文章目录 前言 1 前期准备 2 拍摄与录制 3 后期编辑 4 技巧与注意事项 5 推荐图书 6 粉丝福利 前言 随着智能技术的迅猛发展,AI 短视频制作成为了一种新兴而创新的表达方式,广泛应用于社交媒体、广告营销、教育培训等领域。本文将介绍 AI 短视频…

鸿蒙开发(二)- 鸿蒙DevEco3.X开发环境搭建

上篇说到,鸿蒙开发目前势头旺盛,头部大厂正在如火如荼地进行着,华为也对外宣称已经跟多个厂商达成合作。目前看来,对于前端或客户端开发人员来说,掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

mvtec3d

以bagel为例,其中有calibration、 bagel # 百吉圈(硬面包)calibrationcamera_parameters.jsontestcombinedgt # 缺陷部位的分割剪影pngrgb # 原图pngxyz # tiffcontamination # 污染物同上crack同上good同上 hole同上 traingoodrgbxyzvalidationgood同traincla…

中国人事考试网公布多项考试成绩:注安、一造在列

12月29日,中国人事考试网公布多项职业资格考试成绩,包括大家心心念念想的注册安全工程师、一级造价工程师考试成绩,公告发布的今天,考生即可登录中国人事考试网查询考试成绩。 较早发布的是注册安全工程师考试成绩(成绩…

Python经典游戏 唤醒你童年记忆

这些游戏你玩过几个&#xff1f; 1.贪吃蛇2.吃豆人3.加农炮4.四子棋5. Fly Bird<font color #f3704ab>6.记忆&#xff1a;数字对拼图游戏&#xff08;欢迎挑战&#xff01;用时&#xff1a;2min&#xff09;7.乒乓球8.上课划水必备-井字游戏&#xff08;我敢说100%的人都…

如何获取 ChatGPT 的 OpenAI API 密钥

为什么需要 OpenAI API 密钥&#xff1f; 拥有 OpenAI API 密钥可以解锁多种强大的功能。您可以享受以下一些好处&#xff1a; 访问先进的人工智能模型 OpenAI 开发了 GPT-3 和 Codex 等多种先进的人工智能模型。借助 API 密钥&#xff0c;您可以利用这些模型的功能来执行自然…

面试题:MySQL 自增主键一定是连续的吗?

文章目录 测试环境&#xff1a;一、自增值的属性特征&#xff1a;1. 自增主键值是存储在哪的&#xff1f;2. 自增主键值的修改机制&#xff1f; 二、新增语句自增主键是如何变化的&#xff1a;三、自增主键值不连续情况&#xff1a;&#xff08;唯一主键冲突&#xff09;四、自…

git 常用基本命令, reset 回退撤销commit,解决gitignore无效,忽略记录或未记录远程仓库的文件,删除远程仓库文件

git 基本命令 reset 撤销commit https://blog.csdn.net/a704397849/article/details/135220091 idea 中 rest 撤销commit过程如下&#xff1a; Git -> Rest Head… 在To Commit中的HEAD后面加上^&#xff0c;点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三…

maven阿里源找不到指定jar包解决方案

到这里去找&#xff1a; https://mvnrepository.com/ 例如你要找&#xff1a;spring-boot-starter-web 复制坐标即可。IDEA会去坐标自带的网址寻找资源&#xff0c;可能会慢一点。