当前位置: 首页 > news >正文

PostgreSQL函数自动Commit/Rollback所带来的问题

一、综述

今天在PostgreSQL遇到一个奇怪的现象,简而言之,是想用函数(存储过程)实现插入记录,整个过程没报错但事后却没找到记录!忙活半天,才发现原因是PostgreSQL函数(存储过程)有自动COMMIT或ROLLBACK的特殊规定。

二、问题重现

以下用示例表和示例代码来重现该问题。

create table t1 
(ID int not null primary key,name varchar(20)
);

涉及的存储过程是从oracle那边直接拷贝过来后再修改过的,原先是动态SQL,这里简化为静态SQL。注意其中有个commit;根据PostgreSQL的要求,对事务增加begin...exception...end,否则会有错误或警告。示例脚本代码为:

复制代码

create or replace function p1(pid int, pname varchar)
returns void as $$
beginbegin             --pg对事务的要求insert into t1 values(pid, pname);commit;exception      when others thenend;              --pg对事务的要求
end;
$$ language plpgsql;

依次执行脚本创建存储过程、调用存储过程、查找示例表,结果如下: 

postgres=# \i test1.sql
CREATE FUNCTION
postgres=# select p1(1, 'abc');p1
----
(1 行记录)postgres=# select * from t1;

  id | name
  ----+------
  (0 行记录)

要插入的记录并不存在!惊喜不惊喜?意外不意外?

三、原因分析及解决

仔细查找有关资料,发现有这么一个解释:

Functions and trigger procedures are always executed within a transaction established by an outer 
query — they cannot start or commit that transaction, since there would be no context for them to 
execute in. However, a block containing an EXCEPTION clause effectively forms a subtransaction that 
can be rolled back without affecting the outer transaction.

其意义是PostgreSQL的函数总是默认为一个事务,总是自动Commit或Rollback。

其实一开始没增加begin...exception...end时,PostgreSQL报错“can't begin/end transaction  in pl/pgsql”,已经隐含了这层信息。只是脑子里还是延续Oracle的习惯,而画蛇添足了。

于是,修改存储过程的脚本,按最简单的法子来

create or replace function p2(pid int, pname varchar)
returns void as $$
begininsert into t1 values(pid, pname);
end;
$$ language plpgsql;

为验证此说法是否正确,在再次创建函数、调用函数后,增加一个回滚(事先已设置AutoCommit为false)的操作,然后再查询记录:

postgres=# \i test1.sql
CREATE FUNCTION
postgres=# select p2(1, 'abc');p2
----
(1 行记录)postgres=# rollback;
WARNING:  there is no transaction in progress
ROLLBACK
postgres=# select * from t1;id | name
----+------1 | abc
(1 行记录)

复制代码

四、总结

Oracle是可以在存储过程或函数里指定Commit/Rollback的,如果没有,则外部调用者可以回滚存储过程内部的操作。

但在PostgreSQL,函数(存储过程)总是自动将其所有操作当作一个事务,外部无法对内部操作提交或回滚。

问题好像已经解决,但留有一个疑问没弄明白,为什么PostgreSQL允许在函数体中加关于事务的begin...exception...end,但结果却好像是没提交?

相关文章:

PostgreSQL函数自动Commit/Rollback所带来的问题

一、综述 今天在PostgreSQL遇到一个奇怪的现象,简而言之,是想用函数(存储过程)实现插入记录,整个过程没报错但事后却没找到记录!忙活半天,才发现原因是PostgreSQL函数(存储过程&…...

开源项目介绍-词云生成

开源词云项目是一个利用开源技术生成和展示词云的工具或框架,广泛应用于文本分析、数据可视化等领域。以下是几个与开源词云相关的项目及其特点: Stylecloud Stylecloud 是一个由 Maximilianinir 创建和维护的开源项目,旨在通过扩展 wordclou…...

VSCode设置——通过ctrl+鼠标滚动改变字体大小(新版本的vs)

"editor.mouseWheelZoom": true 第一步: 第二步:...

多种蝴蝶识别分割数据集labelme格式784张9类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):784 标注数量(json文件个数):784 标注类别数:9 标注类别名称:["Monarch","Zebra Longwing"…...

DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 Ollama 🦋 下载 Ollama🦋 选择模型🦋 运行模型🦋 使用 && 测试 二:🔥 Chat…...

SqlSugar简单使用之Nuget包封装-Easy.SqlSugar.Core

SqlSugar官方文档 Nuget包开源地址 Nuget包是为了简化SqlSugar的使用步骤,增加一些基础的使用封装 引入分为两个版本,一个Ioc模式,另一个是注入模式,如果不想影响原本的仓储代码推荐使用Ioc模式,两者区别不到,方法通…...

论文解读 | NeurIPS'24 Spotlight ChronoMagic-Bench 评估文本到视频生成的质变幅度评估基准...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 袁盛海,北京大学硕士一年级学生 内容简介 本文提出了一种新颖的文本到视频(T2V)生成基准ChronoMagic-Bench&#xff0…...

12.1 LangChain数据处理流Data Connection深度解析:构建高效数据管道的五大核心组件

LangChain数据处理流Data Connection深度解析:构建高效数据管道的五大核心组件 一、Data Connection模块的战略定位 LangChain的Data Connection模块是大模型应用的数据中枢,其核心价值在于将非结构化数据转化为大模型可理解的语义知识。传统数据处理的三大痛点在此得到完美…...

文件基础IO

理解"文件" 1-1 狭义理解 文件在磁盘里磁盘是永久性存储介质,因此文件在磁盘上的存储是永久性的磁盘是外设(即是输出设备也是输入设备)磁盘上的文件 本质是对文件的所有操作,都是对外设的输入和输出简称IO 1-2 广义理…...

ASP.NET Core筛选器Filter

目录 什么是Filter? Exception Filter 实现 注意 ActionFilter 注意 案例:自动启用事务的筛选器 事务的使用 TransactionScopeFilter的使用 什么是Filter? 切面编程机制,在ASP.NET Core特定的位置执行我们自定义的代码。…...

Java 中的 Spring 框架,以及 Spring Boot 和 Spring Cloud 的区别?

Spring框架是一个开源的Java平台,主要用于简化企业级应用程序的开发。 它通过提供一系列的功能模块,帮助开发者解决常见的编程难题,从而提高开发效率和代码质量。 Spring框架的核心思想是“控制反转”(IoC)和“面向切…...

Rplayer:手机上的本地音乐播放智能之选

在众多本地音乐播放器中,Rplayer凭借其卓越的功能脱颖而出。它不仅能够精准识别本地下载的音乐文件,更以其智能化的设计为用户带来极致的便捷体验。 Rplayer的真正亮点在于其强大的自动扫描功能。与市面上其他播放器不同,Rplayer无需用户手动…...

vue2-插槽slot

文章目录 vue2-插槽slot1. 什么是slot2. slot分类2.1 默认插槽2.2 具名插槽2.3 作用域插槽 vue2-插槽slot 1. 什么是slot 在vue中,slot翻译为插槽,简单点说,就是在子组件内放置一个插槽,等待父组件在使用子组件的时候决定放什么…...

二级C语言题解:整数序列奇偶个数、拼接数字字符、数组取偶数并加小数点

目录 一、程序填空📝 --- 整数序列奇偶个数 题目📃 分析🧐 二、程序修改🛠️ --- 拼接数字字符 题目📃 分析🧐 三、程序设计 💻 --- 数组取偶数并加小数点 题目📃 分析&…...

VUE之组件通信(三)

1、$refs与$parent 1)概述: $refs用于:父——>子。$parent用于:子——>父。 2)原理如下: 属性说明$refs值为对象,包含所有被ref属性标识的DOM元素或组件实例。$parent值为对象&#x…...

Airflow:深入理解Apache Airflow Task

Apache Airflow是一个开源工作流管理平台,支持以编程方式编写、调度和监控工作流。由于其灵活性、可扩展性和强大的社区支持,它已迅速成为编排复杂数据管道的首选工具。在这篇博文中,我们将深入研究Apache Airflow 中的任务概念,探…...

【号码分离】从Excel表格、文本、word文档混乱文字中提取分离11位手机号出来,基于WPF的实现方案

应用场景 在市场调研过程中,可能会收集到大量的 Excel 表格、文本报告或 Word 文档,其中包含客户的联系方式。通过提取手机号,可以方便后续的市场推广和客户跟进。 当从不同渠道收集到的数据中包含混乱的文字信息时,需要从中提取…...

【分布式架构理论2】分布式架构要处理的问题及解决方案

文章目录 1. 应用服务拆分2. 分布式调用3. 分布式协同4. 分布式计算5. 分布式存储6. 分布式资源管理与调度7. 高性能与可用性优化8. 指标与监控 将分布式架构需要解决的问题按照顺序列举为如下几步 问题分类具体内容应用服务拆分分布式是用分散的服务和资源代替集中的服务和资…...

WPS计算机二级•幻灯片的输出、打印与分享

听说这是目录哦 打印界面讲解⭐所有页面 一键添加公司LOGO🌟将多张幻灯片 打印在一张纸🌠将PPT内容 以讲义形式打印出来☄️打印 黑白色的幻灯片🪐协作编辑模式🌈将PPT输出为图片💖能量站😚 打印界面讲解⭐…...

Java数据结构与算法之“树”

目录 一、什么是树 ​编辑 二、树的相关组成 1. 常用名词 2.需要了解的名词 三、树的分类 (一)初级树 1.普通树 2.二叉树 (二)中级树 1.哈夫曼树HuffmanTree 2.二叉搜索树BST 3.平衡二叉树AVL (三&#x…...

嵌入式八股文面试题(一)C语言部分

1. 变量/函数的声明和定义的区别? (1)变量 定义不仅告知编译器变量的类型和名字,还会分配内存空间。 int x 10; // 定义并初始化x int x; //同样是定义 声明只是告诉编译器变量的名字和类型,但并不为它分配内存空间…...

FPGA的IP核接口引脚含义-快解

疑问 手册繁琐,怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌,手册确实比较详细但繁琐,如何快速知晓该部分信息,涛tao道长给你们说,简单得很,一般新入门的道友有所不知,往往后面…...

Web3技术详解

Web3技术代表着互联网技术的最新进展,它致力于打造一个去中心化的互联网生态系统。以下是对Web3技术的详细解析: 一、Web3技术的核心概念 Web3是第三代互联网技术的代名词,代表着去中心化、区块链驱动和用户自有控制的理念。在Web3的世界中…...

计算机网络之物理层通信基础(电路交换、报文交换与分组交换)

一、电路交换 工作原理: 电路交换是在数据传输期间,源结点与目的结点之间建立一条由中间结点构成的专用物理连接线路,并在数据传输结束之前保持这条线路。整个报文的比特流连续地从源点直达终点,好像在一个管道中传送。 特点&am…...

Linux firewalld开启日志审计功能(2)

在Firewalld防火墙中启用和配置logdenied选项,记录被拒绝的数据包(等同于开启日志功能) 效果展示: 1.开启日志记录功能 firewall-cmd --set-log-deniedunicast #重新加载生效配置 firewall-cmd --reload 2.配置rsyslog捕获日志…...

线程池如何知道一个线程的任务已经执行完成

一、线程池内部任务执行状态监控 在线程池内部,当我们提交一个任务后,线程池会调度一个工作线程来执行该任务的run方法。确实,当run方法正常结束时,意味着任务已经完成。线程池中的工作线程是同步调用任务的run方法,并…...

09网络深入连贯篇(D1_彻底理解长连接 短连接(一))

目录 讲解一:长连接 & 短连接 一、初次见证长连接和短连接 1. 长连接 2. 短连接 二、如何区分当前连接是长连接还是短连接? 三、如何查询长连接和短连接? 四、那么长连接与短连接操作过程又是如何呢? 五、各自优缺点 …...

ElasticSearch学习笔记-解析JSON格式的内容

如果需要屏蔽其他项目对Elasticsearch的直接访问操作&#xff0c;统一由一个入口访问操作Elasticsearch&#xff0c;可以考虑直接传入JSON格式语句解析执行。 相关依赖包 <properties><elasticsearch.version>7.9.3</elasticsearch.version><elasticsea…...

网络计算机的五个组成部分

单个计算机是无法进行通信的。所以需要借助网络。 下面介绍一些在网络里常见的设备。 一、服务器 服务器是在网络环境中提供计算能力并运行软件应用程序的特定IT设备 它在网络中为其他客户机&#xff08;如个人计算机、智能手机、ATM机等终端设备&#xff09;提供计算或者应用…...

责任链模式(Chain Responsibility)

一、定义&#xff1a;属于行为型设计模式&#xff0c;包含传递的数据、创建处理的抽象和实现、创建链条、将数据传递给顶端节点&#xff1b; 二、UML图 三、实现 1、需要传递处理的数据类 import java.util.Date;/*** 需要处理的数据信息*/ public class RequestData {priva…...

在游戏本(6G显存)上本地部署Deepseek,运行一个14B大语言模型,并使用API访问

在游戏本6G显存上本地部署Deepseek&#xff0c;运行一个14B大语言模型&#xff0c;并使用API访问 环境说明环境准备下载lmstudio运行lmstudio 下载模型从huggingface.co下载模型 配置模型加载模型测试模型API启动API服务代码测试 deepseek在大语言模型上的进步确实不错&#xf…...

web-JSON Web Token-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…...

CTF-web: fs.readFileSync特殊利用

URL类 URL 类是 JavaScript 的内置类&#xff08;或对象&#xff09;&#xff0c;它用于处理和解析 URL&#xff08;统一资源定位符&#xff09;。URL 是 Web API 的一部分&#xff0c;广泛应用于浏览器环境和 Node.js 中。 特性 构造函数: URL 类的构造函数可以接受一个 URL…...

深入探索 C++17 特征变量模板 (xxx_v)

文章目录 一、C++类型特征的前世今生二、C++17特征变量模板闪亮登场三、常见特征变量模板的实际应用(一)基本类型判断(二)指针与引用判断四、在模板元编程中的关键作用五、总结与展望在C++的持续演进中,C++17带来了许多令人眼前一亮的特性,其中特征变量模板(xxx_v)以其…...

时间序列分析(一)——基础概念篇

一、时间序列的相关概念 定义&#xff1a;时间序列是按时间顺序排列的一系列观测值&#xff0c;通常以固定间隔&#xff08;如秒、天、年&#xff09;记录。而时间序列分析是一种研究按时间顺序排列的数据点的统计方法&#xff0c;发现趋势、季节性波动、周期性和异常等模式&a…...

贪心与单调栈的艺术:从三道 LeetCode 题看最小字典序问题(316/402/1081)

前言 欢迎来到我的算法探索博客&#xff0c;在这里&#xff0c;我将通过解析精选的LeetCode题目&#xff0c;与您分享深刻的解题思路、多元化的解决方案以及宝贵的实战经验&#xff0c;旨在帮助每一位读者提升编程技能&#xff0c;领略算法之美。 &#x1f449;更多高频有趣Lee…...

rabbitMQ消息转换器

消息转换器 Spring的消息发送代码接收的消息体是一个Object&#xff1a; 而在数据传输时&#xff0c;它会把你发送的消息序列化为字节发送给MQ&#xff0c;接收消息的时候&#xff0c;还会把字节反序列化为Java对象。 只不过&#xff0c;默认情况下Spring采用的序列化方式是J…...

力扣-字符串-541 反转字符串Ⅱ

思路 和《反转字符串》的代码类似&#xff0c;只是每次处理2k个 代码 class Solution { public:string reverseStr(string s, int k) {int length s.length();int reverse 0;while(reverse < length){int left, right;if(reverse k < length){left reverse, right…...

CSS(三)less一篇搞定

目录 一、less 1.1什么是less 1.2Less编译 1.3变量 1.4混合 1.5嵌套 1.6运算 1.7函数 1.8作用域 1.9注释与导入 一、less 1.1什么是less 我们写了这么久的CSS,里面有很多重复代码&#xff0c;包括通配颜色值、容器大小。那我们能否通过js声明变量来解决这些问题&…...

GT 接口时钟

每个 GT 接口需要几个时钟&#xff0c;包括一些共享时钟&#xff0c;这些时钟在位于一个或多个 GT quad 中的绑定 GT*_CHANNEL 单元之间共享。 UltraScale 器件提供高达 128 个 GT*_CHANNEL site 位置&#xff0c;这可能导致在设计中使用几百个时钟。大多数 GT 时钟具…...

算法日记13:SC41树状数组(区间修改)

一、题目&#xff1a; 二、题解&#xff1a; 在单点修改中&#xff0c;我们用t[i]来维护原数组2.1:在区间修改中&#xff0c;我们将维护原数组的差分数组 接下来&#xff0c;让我们来回顾一些差分的性质 此时&#xff0c;假设我们需要求 a 1 a 2 a 3 a 4 a1a2a3a4 a1a2a3a…...

【STM32】串口原理

单片机有自己的RX&#xff08;接收端&#xff09;&#xff0c;TX&#xff08;发送端&#xff09;&#xff0c;有的需要再共同接一个底线&#xff0c;为了保证有相同的参考电势&#xff0c;数据如果是高电平的话&#xff0c;发送过去也是高电平 1.轮询方式 CPU需要时刻注意发送…...

libdrm移植到arm设备

一、环境资源要求 下载libdrm Index of /libdrm 这边使用的是2.4.114版本&#xff0c;版本太高对meson版本要求也很高&#xff0c;为了省事用apt安装meson就不用太高版本了&#xff0c;1.x版本虽然使用makefile编译方便但是太老&#xff0c;对应用支持不太好。 https://dri…...

【PyTorch】解决Boolean value of Tensor with more than one value is ambiguous报错

理解并避免 PyTorch 中的 “Boolean value of Tensor with more than one value is ambiguous” 错误 在深度学习和数据科学领域&#xff0c;PyTorch 是一个强大的工具&#xff0c;它允许我们以直观和灵活的方式处理张量&#xff08;Tensor&#xff09;。然而&#xff0c;即使…...

CS 与 BS 架构的差异

在数字化的今天&#xff0c;选择软件架构模式对系统的性能、维护、安全和成本都有很大影响。BS架构和CS架构是最常见的两种模式&#xff0c;了解它们的区别和特点对开发人员和企业决策者都很重要。 CS架构最早出现&#xff0c;当时用户直接从主机获取数据。随着客户端和服务端…...

一款由 .NET 官方团队开源的电子商务系统 - eShop

项目介绍 eShop是一款由.NET官方开源的&#xff0c;基于.NET Aspire构建的用于参考学习的服务架构电子商务系统&#xff0c;旨在展示如何利用.NET框架及其相关技术栈构建一个现代化的电子商务网站。该项目采用服务架构&#xff0c;将应用程序分解为多个独立的服务&#xff0c;…...

项目顺利交付,几个关键阶段

年前离放假还有10天的时候&#xff0c;来了一个应急项目&#xff0c; 需要在放假前一天完成一个演示版本的项目&#xff0c;过年期间给甲方领导看。 本想的最后几天摸摸鱼&#xff0c;这么一来&#xff0c;非但摸鱼不了&#xff0c;还得加班。 还在虽然累&#xff0c;但也是…...

springboot简单应用

快速开发Springboot项目实现简单的增删改查&#xff0c;前期需要准备&#xff1a;idea与postman安装 Maven&#xff0c;MySQL&#xff08;8&#xff09;&#xff0c;JDK(21) 目录 前言 springboot 使用3.0版本&#xff0c;JDK使用21,MySQL使用8版本 开发环境IDEA使用2024版本 …...

lock 和 synchronized 区别

一、功能 Lock和Synchronized都是Java中用来解决线程安全问题的工具&#xff0c;它们能够确保多个线程在访问共享资源时的正确性和一致性。 二、特性 基本定义与实现&#xff1a; Synchronized是Java中的一个同步关键字&#xff0c;由JVM实现。Lock是Java中的一个接口&#x…...

inquirer介绍及配合lerna在Vue中使用示例

目录 安装基本用法使用多个提示框动态选择&#xff08;动态选项&#xff09;表单式输入配合lerna在Vue中使用示例 Inquirer 是一个用于创建交互式命令行工具的 Node.js 库&#xff0c;常用于收集用户输入。它提供了多种类型的提示框&#xff0c;可以用于创建交互式应用程序&…...