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

前言

几年前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实践中遇到的一个问题。

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

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

相关文章

一种轻量分表方案-MyBatis拦截器分表实践|京东零售技术实践

背景 部门内有一些亿级别核心业务表增速非常快,增量日均100W,但线上业务只依赖近一周的数据。随着数据量的迅速增长,慢SQL频发,数据库性能下降,系统稳定性受到严重影响。本篇文章,将分享如何使用MyBatis拦…

企业微信获客助手怎么实现抖音数据回传?

在数字化时代,企业微信获客助手和数灵通外链已经成为企业获取潜在客户的得力助手。通过在微信站外的各个渠道上捕获潜在客户,企业能够更好地满足客户需求并提高业务增长。而抖音作为当前最热门的短视频平台,也成为了企业营销的重要战场。 企业…

OTG -- ULPI接口芯片USB3318讲解(二)

目录 前沿 1 初识USB PHY芯片 2 ULPI接口与USB PHY芯片 3 USB3318简介 3.1 USB3318引脚定义 3.2 USB3318与ULPI接口时序 3.3 STM32F407 OTGHS如何驱动USB3318 3.4 USB3318原理图设计 4 总结 前沿 前面对STM32F407 OTG模块进行了简单的讲解,如果使用OTG_FS模…

期末成绩群发给家长

每当学期结束,老师们的邮箱和手机便会被成绩报告单填满。那么,如何高效地将成绩群发给家长呢? 一、邮件还是短信? 首先,选择一个合适的通讯方式是关键。邮件正式且便于附件,但短信更快捷。考虑到大多数家长…

项目经理如何成功接手做到一半的项目:从0到1的高效指南

最近看到很多帖子,吐槽自己一年到头来一直频繁被拉去救火、去接做到一半的项目。这种情况应该是很多项目经理都会遇见的,大多数情况是因为前任项目经理由于各种原因,如调岗、离职而留下的项目,但往往到大家手上的时候,…

Qt实现窗口吸附屏幕边缘 自动收缩

先看效果: N年前的QQ就可以吸附到屏幕边缘,聊天时候非常方便,不用点击状态栏图标即可呼出QQ界面 自己尝试做了一个糙版的屏幕吸附效果。 关键代码: void Widget::mouseMoveEvent(QMouseEvent *e) {int dx e->globalX() - l…

Java Chassis 3技术解密:与Spring Cloud的互操作

作者:刘宝 原文链接:Java Chassis 3技术解密:与Spring Cloud的互操作-云社区-华为云 Java Chassis 3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。 比如通过引入微服务网关,来解决不同语言、不同框架、…

C#,洛布数(Lobb Number)的计算方法与源代码

1 洛布数(Lobb Number) 在组合数学中,洛布数(Lobb Number)L(m,n)计算nm开括号的排列方式,以形成一个有效的平衡括号序列的开始。 Lobb数由两个非负整数m和n参数化,其中n>m>0。…

计算机网络实验一

目录 实验一 使用PacketTracer组建简单局域网 1、实验目的 2、实验设备 (1)内容一(组建简单局域网): (2)内容二(使用交叉线直连两台机器): &#xff08…

基于SpringBoot+Vue学科竞赛管理系统

文章目录 基于SpringBootVue学科竞赛管理系统1系统概述1.3系统设计思想 2相关技术2.1 MYSQL数据库2.2 B/S结构2.3 Spring Boot框架简介2.4 Vue简介 3系统分析3.1可行性分析3.1.1技术可行性3.1.2经济可行性3.1.3操作可行性 3.2系统性能分析3.2.1 系统安全性3.2.2 数据完整性 3.4…

「数据结构」1.初识泛型

🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇欢迎点赞收藏加关注哦! 初识泛型 🍉前言🍉包装类🍌装箱&拆箱 🍉泛型🍌擦除机制&#x1f…

拒绝单调,Focussend智能AI助阵邮件营销,让打开率大幅提升

在互联网时代,邮件营销成为了企业推广产品和服务的一把重要利器。但是,面对大量垃圾邮件和用户审美疲劳,如何让你的邮件脱颖而出,成为了每一个市场人的头疼问题。光靠无聊的标题和内容可不行,得有点新花样。 搜索&…

记一次某竞赛中的渗透测试(Windows Server 2003靶机漏洞)

靶机简介 Windows Server 2003是微软公司于2003年3月28日发布的服务器操作系统,它基于Windows XP/Windows NT 5.1进行开发,并在同年4月底上市。以下是关于Windows Server 2003的详细介绍: 系统名称与发布历程: 该产品最初被命名为…

linux vim 异常退出 异常处理 交换文件

交换文件 *.swp 格式 同时是隐藏的 如在vim一个文件, 在没有正常退出, 如直接断开连接 在次编辑这个文件 会出现下图的错误 解决方案: 直接删除这个交换文件即可 rm -fr .zen.txt.swp

经典左旋,指针面试题

今天给大家带来几道面试题! 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 我们可以先自己自行思考,下面是参考答案: 方法一: #define _CRT_SEC…

人工智能网络安全挑战赛(AIxCC):超亿元大奖等你来拿!

2023年底,DARPA开启了一项前所未有的挑战——人工智能网络安全挑战赛(AIxCC),旨在通过技术竞赛探索AI时代下网络安全的新格局。该赛事希望孕育出一种创新的网络安全通用人工智能(AGI)系统,该系统…

从0到1入门C++编程——06 类和对象之多态、文件操作

文章目录 多态1.多态基本概念2.多态案例——计算器3.纯虚函数和抽象类4.多态案例——制作饮品5.虚析构和纯虚析构6.多态案例——电脑组装 文件操作1.文本文件--写文件2.文本文件--读文件3.二进制文件--写文件4.二进制文件--读文件 多态 1.多态基本概念 多态是C面向对象的三大…

阿里云 DMS 执行sql变更

数据库开发-数据变更-无锁变更 选择数据库:比如要更新生产库,搜索生产库名字。 填入变更sql。

实现两栏布局和三栏布局的多种详细方法

目录 一、背景两栏布局三栏布局 二、两栏布局flex弹性布局 三、三栏布局两边使用 float,中间使用 margin两边使用 absolute,中间使用 margin两边使用 float 和负 margin使用 display: table 实现使用flex实现grid网格布局 参考文献 一、背景 在日常布局…

AI大模型专题:大模型赋能座舱,智能座舱新战场

今天分享的是AI大模型系列深度研究报告:《AI大模型专题:大模型赋能座舱,智能座舱新战场》。 (报告出品方:国泰君安证券) 报告共计:19页 大模型技术将给予智能座舱一次深度进化 拥抱大模型技术…