PostgreSql和Oracle的事务机制区别以及对程序的影响

news2024/12/23 7:01:21

前言

几年前IT信息产业的一些核心技术包括架构、产品以及生态都是国外制定,然而自从“遥遥领先”公司被制裁后,国家开始大力支持信息产业“新基建”,自2020年开始市场上涌现出了大量的国产化软件,就国产化数据库而言我所在的公司有两款国产化数据库,一款是基于mysql,另一款则是基于postgreSQL,相信市面上大多国产化数据库也是基于这两款开源数据库演化而来。一般使用国产化数据库的项目大多是一些政企项目或者公司自己的核心项目,这些项目原先也大多使用的是oracle数据库,那么今天就来聊聊把项目从oracle迁移到基于PostgreSql的国产化数据库(下文将直接使用postgreSql替代基于postgresql的国产化数据库)上遇到的一个问题。

一、系统事务管理

事务管理是任何系统都应该具备的核心功能,然而一些java开发者包括我在内在写代码时往往会忽略这个重要的东西,这并不是我不了解事务管理的重要性,其最大的原因就是日常使用的框架都提供了很完善的事务管理机制,不需要开发者针对事务上写大量代码,比如spring,spring提供的事务管理有两种一种是声明式,另一种是编程式,目前我个人使用最多的就是声明式事务了。然而声明式事务我个人认为有个缺点,就是事务控制的粒度太大,因为声明式事务时基于注解实现的,所以最小粒度为方法级别。

二、问题的暴露

工作中维护老代码时,发现祖传写法都是下图这个样子,在service类上添加事务注解,方法上和方法调用的子方法并不做事务控制,这个例子中AutomaticRechargeInitiationProcess类中还是很多逻辑,换句话说这个程序中只要出现了一点问题,那么事务就要全部进行回滚。
在这里插入图片描述
于是代码维护者们发现有些程序即使错误了也不应该进行回滚,比如记录一些程序处理过程等或者错误是在预料之中的。于是又在AutomaticRechargeInitiationProcess代码中添加了类似下图的代码。

在这里插入图片描述
类似这种代码其实在一些大型老旧项目中是很常见的,原因是项目迭代时间太久,经手的开发人员技术水平参差不齐,比如我目前维护的项目截至2024年一月已经整整12个年头了,经手的开发人员没有一百也有八十了,代码的规范性已经被破坏,代码的维护变得困难。而另一种情况是,随着时间的发展,业务也在演进,比如从2020年新增了一种业务,需要新增表,正确的做法是程序中根据时间节点判断是否查询新表,然而总有大聪明不按套路出牌,他的逆向思维促使他程序中不做任何判断,反而新建了若干张历史月份表。后续开发者可能发现了隐患,于是在程序中使用try catch的方式将查询新表的代码进行处理。这样看似完美,实际运行倒也未发生什么问题。

问题的暴露发生在了今年的国产化替代项目上,项目在功能测试阶段由于都是使用的近几月的数据进行的自动化回归验证,所以并没有发现问题,当上到生产上时,发现业务在查询比较久远的历史数据时,前台直接报错了,查看日志发现报错几乎全部为“current transaction is aborted, commands ignored until end of transaction block”,根据日志可以发现是数据库驱动抛出的异常,日志还打了某张表不存在。异常如下:

在这里插入图片描述
既然找到了日志那问题的定位也就简单了,原因就是因为表不存在触发了postgreSql的事务机制,导致了继续使用出现过异常的事务进行数据库操作就会报出上图异常,那么问题来了,原来的oracle为什么不会出现问题?

PostgreSql和Oracle的事务机制区别

咨询了公司大佬,给出的答复是:Oracle具有子事务功能,Oracle没有遵循SQL规范,只做了部分回滚;postgreSql遵循SQL规范,一个事务的多条SQL要么全部成功要么全部失败。

自己查询了资料发现:

orale的子事务是指一个大事务可以包含多个小事务,而每个小事务可以单独提交或者回滚,同时也支持跟随父事务进行提交或回滚。其实现原理为嵌套事务结合保存点来实现的。

postgresql也支持“子事务”,但是pg的子事务和oracle不同,他不具备独独立提交和回滚的能力,必须依赖大事务,但是这个功能也需要在jdbc连接串中配置autosave=always&cleanupSavepoints=true来开启。但是这种方式存在风险,如果一个事务中存在多个DML语句,这样失败的回滚,成功的提交,会造成业务数据不一致,使用时需要谨慎。
官方对两个参数的解释如下:
在这里插入图片描述
以上便是我在去O实践中遇到的一个问题。

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

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

相关文章

vue2+html2pdf下载PDF,PDF分页切割

问题: PDF下载下来后,文档内容被暴力分割。 解决方案: HTML <!-- 打印按钮 --> <el-button type="primary" size="small" class="el-icon-download right_btn" @click="downloadPDF">PDF</el-button><!-- …

Windows存储空间不足局域网文件共享 Dism备份系统空间不足

问题情景 在日常使用中难免遇到Windows的空间不足的情况&#xff0c;常用办法是清理垃圾释放空间&#xff0c;部分场景例如我们需要使用Dism备份完整系统&#xff0c;所以需要非常大的存储空间不够&#xff0c;如果空间不够什么才是最有效的方案呢&#xff1f; 我们假设身边没有…

字符串转换const char* , char*,QByteArray,QString,string相互转换,支持中文

文章目录 1.char * 与 const char * 的转换2.QByteArray 与 char* 的转换3.QString 与 QByteArray 的转换4.QString 与 string 的转换5.QString与const string 的转换6.QString 与 char* 的转换 在开发中&#xff0c;经常会遇到需要将数据类型进行转换的情况&#xff0c;下面依…

伪原创生成器手机版,移动端上写文章更方便!

伪原创生成器虽然不少&#xff0c;但我们大家见到最多的还是电脑使用版&#xff0c;然而提及到伪原创生成器手机版的资源却不是那么多&#xff0c;特别是对于现在手机端也成为了大家办公的一大途径&#xff0c;这主要也是因为手机的便携性&#xff0c;它可以做到让大家随时随地…

【图例】直观的感受MySQL事务的隔离级别分别解决了什么问题?以及如何查看和设置事务隔离级别!

目录 前言一、读未提交&#xff08;Read Uncommitted&#xff09;二、读已提交&#xff08;Read Committed&#xff09;三、可重复读&#xff08;Repeatable Read&#xff09;四、串行化&#xff08;Serializable&#xff09; 前言 在MySQL中&#xff0c;事务的隔离级别决定了…

如何本地搭建Emby影音管理服务并结合内网穿透实现远程访问本地影音库

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

UE4 C++ 结构体

先在UCLASS()前写入&#xff1a; USTRUCT(BlueprintType) struct FMyStruct //必须以"F"开头 {GENERATED_BODY() //必须添加“GENERATED_BODY()”UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "MyStruct1")int32 Health;UPROPERTY(EditAnywher…

【算法】拦截导弹(线性DP)

题目 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c;雷达捕捉到敌国的导弹来袭。 由于该系…

04. 【Linux教程】安装 Linux 操作系统

通过前面的小节学习&#xff0c;我们已经对 Linux 操作系统有了简单的了解&#xff0c;同时也在 Windows 下安装了虚拟机软件 VMware &#xff0c;那么本节课我们就介绍下如何使用虚拟机软件安装 Linux 操作系统。 通过第一小节的学习我们知道 Linux 有很多的发行版本&#xf…

Unity 访问者模式(实例详解)

文章目录 实例1&#xff1a;简单的形状与统计访客实例2&#xff1a;游戏对象组件访问者实例4&#xff1a;Unity场景对象遍历与清理访客实例5&#xff1a;角色行为树访问者 访问者模式&#xff08;Visitor Pattern&#xff09;在Unity中主要用于封装对一个对象结构中各个元素的操…

用Audio2Face导出Unity面部动画

开始之前说句话&#xff0c;新年前最后一篇文章了 一定别轻易保存任何内容&#xff0c;尤其是程序员不要轻易Ctrl S 在A2F去往Unity的路上&#xff0c;还要经历特殊Blender&#xff0c;自己电脑中已下载好的可能不是很好使。 如果想查看UE相关的可以跳转到下边这两篇链接 1. …

Qt QWidget Loading界面并覆盖在其他控件上面

目录 一、效果图二、Loading三、使用 一、效果图 界面中有一个Label&#xff0c;一个Button 点击Buttion&#xff0c;显示Loading的界面&#xff0c;并覆盖到Label和Button上面 二、Loading loadingwidget.h #ifndef LOADINGWIDGET_H #define LOADINGWIDGET_H#include <…

曲线拟合、多项式拟合、最小二乘法

最近在做自车轨迹预测的工作&#xff0c;遇到 曲线拟合、多项式拟合、最小二乘法这些概念有点不清晰&#xff0c; 做一些概念区别的总结&#xff1a; 曲线拟合用于查找一系列数据点的“最佳拟合”线或曲线。 大多数情况下&#xff0c;曲线拟合将产生一个函数&#xff0c;可用于…

1.26模拟退火

模拟退火是爬山算法的一种&#xff0c;是搜索算法 初始阶段 即只有在每次更新方案时&#xff0c;才会使循环次数增加

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端 Web开发技术…

屈子祠镇黑鱼岭,不可移动文物预防性保护系统守遗珍

一、何止秦俑 秦陵苑囿青铜水禽等文物集中展出 文物保护&#xff0c;尤其是不可移动文物的保护&#xff0c;一直都是文化遗产的重要环节。湖南省汨罗市屈子祠镇双楚村黑鱼岭墓地&#xff0c;作为长江中游地区的重大考古发现&#xff0c;其商朝晚期的历史背景赋予其不可估量的历…

鸿蒙开发实战-运动app开发

主要开发内容 3.1 开发准备 想要实现以下功能的话&#xff0c;需要学习“Tabs”&#xff0c;“TabContent”&#xff0c;“Row”&#xff0c;“Column”&#xff0c;等等相关技术。 主页 静坐页面   除此之外&#xff0c;还需要先准备8张图标的图片以及应用开发所需要的图片…

Python下载安装与环境配置

本文将指导您完成Python的下载、安装以及环境配置过程&#xff0c;确保您在编写和运行Python代码时能够获得最佳体验。我们将提供详细的步骤和代码示例&#xff0c;帮助您顺利完成设置。 一、Python下载与安装 访问Python官网&#xff1a;首先&#xff0c;您需要访问Python的官…

Django模型(六)

一、其它查询 文档:https://docs.djangoproject.com/zh-hans/4.1/ref/models/querysets/#count 1.1、排序 Queryset.order_by(*fields) 默认情况下,QuerySet 返回的结果是按照模型 Meta 中的 ordering 选项给出的排序元组排序的 可以通过使用 order_by 方法在每个 QueryS…

RocketMq5源码搭建

最近公司使用到了RocketMQ,所以打算研究一下RocketMQ 准备自己动手搭建一下RocketMq源码 前提 需要搭建jdk环境&#xff0c;jdk版本需要高于1.8 首先 从github 拉源码 源码地址&#xff1a;rocketMq源码传送门 启动namesrv 启动之前需要配置一下ROCKERMQ_HOME 配置如下&a…