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

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

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

相关文章

辽宁链家新房数据采集与可视化实现

摘 要 网络爬虫也叫做网络机器人,是一种按照一定的规则,自动地抓取网络信息,进行数据信息的采集与整理的程序或者脚本。随着海量数据的出现,如何快速有效的获取到我们想要的数据成为难题。以房源信息为例,该文使用Pyt…

做虾皮Shopee想高效发货?EasyBoss ERP的这个功能你不能错过!

随着业务的发展,许多Shopee、Lazada卖家的店铺订单量逐渐增大、仓库商品的SKU也越来越多。在这种情况下,一些卖家会选择采用人海战术来提高拣货、发货的效率。效率提高的同时,也意味着企业的用人成本的增加! 那么,如何…

在windows和Linux中的安装 boost 以及 安装 muduo

二、安装boost boost官网:boost官网 我下载的boost版本: windows:boost_1_84_0.ziplinux:boost_1_84_0.tar.gz 2.1 在windows中安装boost和测试 (1)在windows中,解压这个压缩包boost_1_84_0.zip,路径为…

【力扣经典面试题】189. 轮转数组

题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 …

免费的ppt网站分享

前言 相信大学生们深有体会,对于学校而言,好像是任何活动都需要我们做ppt,当你拿着自己辛苦做的ppt去展示现场的时候,你看到别人的ppt比你的还好,此时心情就是毙,当你知道人家不过是仅仅的1个小时不到就完成…

Java编程练习之类的封装

1.把一个Student类封装起来,模拟一个转校生转入新学校后为其制作学生信息的过程。运行结果如下: package zhtestdemo; import java.util.Scanner; import java.text.DecimalFormat; public class demo { //创建类,类名叫demo; private Stud…

使用阿里云的IDaaS实现知行之桥EDI系统的单点登录

,在开始测试之前,需要确定用哪个信息作为“登陆用户的ID字段”。 这个字段用来在完成SSO登陆之后,用哪个信息将阿里云IDaaS的用户和知行之桥EDI系统的用户做对应。这里我们使用了 phonenumber 这个自定义属性。需要在阿里云做如下配置&#x…

c++阶梯之引用与内联函数

1. 引用 1.1 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 语法 类型& 引用变量名(对象名) 引用实体; 示例 很显然,在下面这…

stm32--simulink开发之--timer的学习,硬件输入中断,触发事件

总体的参考链接是: https://ww2.mathworks.cn/help/ecoder/stmicroelectronicsstm32f4discovery/ref/timer.html 输入: 1,配置项:Enable frequency input 缩写:freq conunt 说明:“freq count — Frequency…

2024热门游泳耳机排行榜,精选四款游泳耳机品牌

在追求健康生活的今天,游泳成为了许多人健身的首选活动之一。而为了让游泳体验更加愉悦,选择一款适合的游泳耳机显得尤为重要。这不仅能够为游泳者提供动感的音乐,缓解游泳过程中的疲劳感,同时还有助于提高游泳效率。在市场上琳琅…

中文计算机自学指南:打开全栈开发之门 | 开源日报 No.161

PKUFlyingPig/cs-self-learning Stars: 40.3k License: MIT cs-self-learning 是一个计算机自学指南。 该项目旨在提供一本完整的计算机自学指南,帮助初学者通过优质资源快速成长为全能程序员。 主要功能和核心优势包括: 提供丰富的开源课程资源支持多…

案例三:U盘提示格式化?3种方法帮你拯救它

在U盘的使用过程中最尴尬的情况就是遇到“无法打开,需要进行格式化”的提示。此时,我们如何才能在不破坏内部数据的情况下,挽救这个U盘呢? 小编今天就和说3个方法,可以用来解决U盘“无法打开,需要进行格式化…

工作流框架Activiti

工作流框架activiti 实现入住管理,审批流。 实现入退住,涉及多个表单的提交和多个角色的审核,若要实现这些流程的开发,最好的技术选型是使用工作流技术。 工作流(Work Flow):是一项将系统任务或操作抽取&#xff0c…

Windows10更新失败 错误 0x80070643、KB5034441的解决方法之二

Windows10更新失败 错误 0x80070643、KB5034441 在知乎Windows10更新失败 错误 0x80070643、KB5034441的原因分析和几个解决方法 - 知乎 参考文章进行操作,更详细信息自己看上面链接。 我电脑的硬盘是mbr格式,而且没有划分恢复分区。 Microsoft Windo…

nop-entropy可逆计算入门(1)

第1步:从大佬的gitee:https://gitee.com/canonical-entropy/nop-entropy下载源码,进行本地编译,具体编译看项目下的readme,想偷懒的可以下载我编译后的jar,放到自己的maven仓库 https://pan.baidu.com/s/15qANnrCh5RV…

Node.js的学习1

Node.js简介 浏览器是JavaScript的前端运行环境Node.js是JavaScript的后端运行环境Node.js中无法调用DOM和BOM等浏览器内置API 终端中的快捷键 使用向上箭头,可以快速定位到上一次执行的命令使用tab键,可以快速补全路径使用esc键,可以快速清…

Sentinel 知识总结

Sentinel 知识总结 Sentinel 是阿里巴巴开源的一个轻量级流量控制框架,主要用于保护系统稳定性和流畅性。它提供了多种流量控制策略,包括QPS限流、并发数限流、线程池限流等,并且支持集群限流。此外,Sentinel还提供了熔断降级、系…

学习使用vite+vue3的所遇问题总结

组件中使用<script>标签忘记加 setup 这会导致Navbar 没有暴露出来&#xff0c;导致使用不了&#xff0c;出现以下报错 这是因为&#xff0c;如果不用setup&#xff0c;就得使用 export default …… setup 是后者的语法糖 在Vue.js中&#xff0c;你可以通过route对象…

USTC ICS(2023Fall) Lab5 Password Verification

LC-3汇编语言 .orig x3000 LOOP1 AND R1,R1,#0ADD R1,R1,#3LEA R0, string1PUTS ;打印string1AND R0,R0,#0ADD R0, R0, #10 OUT ;打印换行符GETCOUT;检查输入的字符是否为W(ASCII码为87)ADD R0,R0,#-16ADD R0,R0,#-16ADD R0,R0,#-16ADD R…

H5网站在线客服小程序源码系统,完全开源可二开 带完整的安装代码包以及搭建教程

互联网的快速发展&#xff0c;H5网站已成为企业与客户沟通的重要渠道。然而&#xff0c;许多H5网站在客户服务方面存在不足&#xff0c;无法及时响应客户的问题和需求。小编给大家分享了一款H5网站在线客服小程序源码系统&#xff0c;旨在为企业提供完善的客户服务解决方案。 …