POSTGRESQL 子事务的问题与注意事项

news2024/11/26 5:25:05

3a7e455a39a4c7c8cb8bcdd3fa64f3fc.png

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1050人左右 1 + 2 + 3)新人会进入3群

在获得一些新的问题中,关于子事务的问题是我第一个想在 review的,关于子事务,首先在PG中一直被强调的子事务性能不是很好的口碑下,到底为什么还会有使用的子事务的情况,这是因为有着方面的需求。

举例,在一个事务中如果报错的情况下,我们的事务会怎样

3885a86c749d7a44d652f296be5294e3.png

postgres=*# select 13 / 0;
ERROR:  division by zero
postgres=!# select 'could we still work';
ERROR:  current transaction is aborted, commands ignored until end of transaction block
postgres=!#

为什么要使用子查询,这个问题在上面的事务工作的情况下,一目了然因为在整个事务的设计中,很可能会报错,但是我将事务设计是按照一个连贯的逻辑来设计的,也就是即使出现了错误,我也希望这个事务通过某个功能来继续有选择的执行。

那么核心点是错误与继续工作,我们在PG的事务中换一个写法

b924eb8e4e99ca52d4637251f8dc7af3.png

postgres=# begin;
BEGIN
postgres=*# select 'could we still work';
      ?column?       
---------------------
 could we still work
(1 row)

postgres=*# savepoint a;
SAVEPOINT
postgres=*# select 13/0;
ERROR:  division by zero
postgres=!#
postgres=!# rollback to savepoint a;
ROLLBACK
postgres=*# select 'could we still work, yes';
         ?column?         
--------------------------
 could we still work, yes
(1 row)
postgres=*# commit;
COMMIT

c4c20b86ea14d27dd3220f329527aa9a.png

00c3de1b3dd382ae68c4c48a337110e7.png

我们可以看上面的这个实例,在这个虽然这里我并没有使用 savepoint 但是我达到了一个类似的效果,就是如果我部分的子事务错误了,通过判断我可以跳过,继续执行。

那么问题来了,我们为什么要提出一个避讳子事务的事情,或者说save point的问题。

首先我们都已经了解了POSTGRESQL MVCC的机制下,除了有global的事务XID,同时如果你在事务中启用了 SAVEPOINT 则还会产生关于这个事务里的子事务的事务ID,这就会导致一个问题的发生,每个子事务都开始使用大量的使用自己的事务ID来进行分配,来完成嵌套事务。我用一个简单的例子就可以掩饰通过 save point后导致的情况。

67db78215ff909cd6e9c50ce98081b3e.png

从上图想说明一个问题,在一个事务内对一个行进行了三次改变,并且进行了三次的 save point , 则从事务内看产生了针对修改行的三个变化行,从侧面的图也可以看出,最早为在事务中的ctid 是 0,2 后面是 ctid (0,5)则整体在事务运行中,会有行的多个版本。

这就导致一些问题存在,一个事务中可以存在更多的在COMMIT 后的死行,同时导致事务运行中MVCC 会承接更多的对于其他事务在这个事务中的数据的可见性的判断的消耗。除此以外从源代码中PG对于子事务的也有相关的限制。系统在子事务运行中,还要时刻判断子事务事务溢出了,这里默认在代码中最大的子事务的最大数量是64个。

3b8277c92ce1eb3f0fa28637c8dcf4b8.png

除此以外,在savepoint的使用中,还要注意,savepoint的 产生, 回滚和释放等几个事情。尤其在使用了子事务后,注意可以在事务中就对不在需要的 savepoint进行释放,而不是等到最后在进行commit 的时候才进行释放。

4ba3f467313ec2a10692f620c5b5c697.png

那么这里针对POSTGRESQL的 SAVEPOINT 有什么建议

1 尽量不要使用POSTGRESQL 的SAVEPOINT 

2 如果使用可以采用 begin  exception  end  的方案来替换一些在事务里面对于出现问题后的跳过或有选择的跳过的方法。

3 如果必须使用SAVEPOINT 请注意不要太依赖,同时积极的在事务内进行SAVEPOINT的释放,同时注意你的最大同时可以存在的SAVEPOINT 是64。

最后还是那句话,数据库功能有和没有伤害的持续大量的使用是两个概念。

dc9f01faab4e2b1cc1d5591debf12915.png

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

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

相关文章

使用conda pack进行环境迁移

起因 起因是训练服务器为了安全期间,限制不能联网。而且想连接A100显卡的训练服务器必须通过堡垒机方可连接(即目标服务器既不能联网,也与本机不在同一个网段) 安装工具 首先,使用 conda env list 查看所有环境&…

Data与Java8中的LocalDate相互转换

一、前言 Date这个类在java.util包中,始于jdk1.0。后来在jdk1.8时,针对日期类进行了一个大的更新,专门新建了java.time包,新的日期类LocalDateTime就在这个包中。 日常工作中,很容易碰到旧日期类Date,与新…

回归预测 | MATLAB实现TCN-GRU时间卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-GRU时间卷积门控循环单元多…

C语言数据在内存中的存储

目录 前言 本期内容介绍 一、数据类型的介绍 1.1类型的意义: 1.2C语言中是否有字符串类型? 1.3类型的基本归类 整型家族: 浮点型(实型)家族: 构造(自定义)类型:…

通过 CSS 的样式实现语音发送动效类似声音震动的效果

实现效果&#xff1a;一般用于发送语音的时候&#xff0c;出现动画效果 //模版部分 <view class"musical-scale"><view class"scale"><view class"em" v-for"(item,index) in 15" :key"index"></view…

记录这这段时间发生的事情。

当做后端的时候总是被骂做前很丑。成为一个UI设计师与后端工程师才会更加完美。 尝试着做一个主页面。 创建了一个主页面 的表格index。 收录了希望发送到主页的&#xff0c;的帖子。 并且&#xff0c;可以填写是否可以。 一个看起来不错的主页。 标题设计的左右框。 这种框…

自动化运维——Ansible学习(四)——roles角色

目录 一、roles概述 二、角色的使用 1.角色(roles)&#xff1a;角色集合 2.roles建议存放位置 3.调用角色的方法 (1)调用角色方法1 (2)调用角色方法2 4.完整的角色架构 5.roles playbook tags使用 三、Ansible Roles目录编排 四、roles目录 (一)roles目录结构 …

剑指offer简单题01-10

01 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型一维数组 * return int整型*/public int duplicate (int[] numbers) {// write code hereint…

【计算机视觉|人脸识别】 facenet-pytorch 项目中文说明文档

下文搬运自GitHub&#xff0c;很多超链接都是相对路径所以点不了&#xff0c;属正常现象。点击查看原文档。转载请注明出处。 原作者暂时并未对我的提交做出回应&#xff0c;这里同步提交到CSDN&#xff0c;点击查看项目源码 使用 Pytorch 进行人脸识别 Click here to return …

git 和adb

一、git 1、git的作用 git是一个版本控制系统&#xff0c;是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 我的理解就是代码管理器&#xff1a; 第一点你可将代码备份到git仓上&#xff1b; 第二点可记录的你修改记录&#xff1b; 第三点…

Vue中TodoLists案例_删除

与上一篇Vue中TodoList案例_勾选有三个文件变化了 App.vue&#xff1a;添加了一个deleteTodo根据id删除方法&#xff0c;传递给儿子组件MyList <template><div id"root"><div class"todo-container"><div class"todo-wrap"…

Android ObjectBox数据库的使用与详解

一、介绍 Room数据库 之前我已介绍了jetpack组件的数据库&#xff1a;Room&#xff0c;有小伙伴需要了解Room数据库可以查看这个地址&#xff1a;Android JetPack组件之Room数据库的集成与详解_android room数据库_蜗牛、Z的博客-CSDN博客 数据库的性能对设备来说很重要&#…

【雕爷学编程】Arduino动手做(168)---ATTINY85迷你USB开发板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【Spring MVC学习】连接 接收请求参数 响应返回参数

目录 前言&#xff1a;认识Spring MVC &#x1f337;1、什么是MVC&#xff1f; 一、建立连接&#xff08;5个注解&#xff09; &#x1f337;1、RequestMapping注解:注册接⼝的路由映射&#xff08;默认返回页面&#xff09; &#x1f337;2、ResponseBody注解&#xff1a…

从简单线性回归到TensorFlow深度学习

大家好&#xff0c;人工智能近年来变得越来越流行&#xff0c;学习人工智能的需求也随之增加&#xff0c;尤其是许多IT专业人士希望利用机器学习的强大功能&#xff0c;但面临不小的挑战&#xff0c;尤其是在理论和数学上。 步骤1&#xff1a;线性回归 线性回归是一种统计学中…

Centos7:http/PhP升级

系列文章目录 RHCE第0章&#xff1a;RHCE开始前的准备 RHCE第1章&#xff1a;Web服务器&#xff08;上&#xff09; RHCE第1章&#xff1a;Web服务器&#xff08;下&#xff09; RHCE第2章&#xff1a;DNS服务 RHCE第3章&#xff1a;DHCP服务器 RHCE第4章&#xff1a;Firewall…

第一天基础名词

文章目录 一、域名1、域名的概念2、域名注册3、域名的分类 二、DNS1、DNS的概念2、DNS解析3、本地hosts文件与DNS的关系4、如何查看本地Hosts文件 三、CDN1、CDN的概念2、CDN原理&#xff08;1&#xff09;回顾域名解析&#xff08;2&#xff09;CDN原理 3、常见DNS攻击 四、脚…

【C语言】结构体与offsetof实现

远看山有色&#xff0c;近听水无声。春去花还在&#xff0c;人来鸟不惊。 — 唐代王维《画》 这篇博客我们会详细介绍结构体相关知识&#xff0c;干货满满。 结构体的声明&#x1f340; 一般来说结构体应该有成员列表和变量列表这两个基础的模式。 例如描述一个学生&#xf…

Windows下YUICompress实现js、css混淆压缩

首先&#xff0c;我们针对Linux下的部分命令进行Windows系统的对应实现 ls————cmd /c dir/b rm————cmd /c del mv————cmd /c move pwd————cmd /c chdir 注&#xff1a;cmd /c是执行完命令后关闭命令行窗口、cmd /k是执行完命令后不关闭命令行窗口、cmd /c sta…

Vue第五篇:电商网站登录时vuex的使用

页面&#xff1a; 代码资源见&#xff1a;https://download.csdn.net/download/benben044/88071987 其中css使用开源库的UI&#xff0c;Main里面的元素是一张截图。 通过vuecli脚手架生成的代码架构如下&#xff1a; 一、入口组件App.vue解析 主页面主要由两部分组成&#x…