将 postgreSQL 存储过程作为一个事务执行

2024-01-30

我正在使用 PostgreSQL 9.3,并且创建了一些包含多个语句的存储过程。我在准备好的语句的帮助下在 Java 应用程序中调用此存储过程。

现在我读到存储过程中的每个语句都作为一个事务执行,即每个语句后一次提交。但我想要的是将整个存储过程作为一个事务执行,即只有一次提交。

我怎样才能做到这一点?也许在 JDBC 级别停用自动提交?


嗯,基本上是存储过程are本质上是原子的,并作为一个事务执行。

CREATE TABLE xxx (id int PRIMARY KEY);

CREATE OR REPLACE FUNCTION f() RETURNS void AS $$
DECLARE
  len int;
BEGIN
  RAISE NOTICE 'Transaction ID: %', TXID_CURRENT();
  INSERT INTO xxx VALUES (1);

  RAISE NOTICE 'Transaction ID: %', TXID_CURRENT();
  INSERT INTO xxx VALUES (2);

  RAISE NOTICE 'Transaction ID: %', TXID_CURRENT();
  SELECT COUNT(*) FROM xxx INTO len;
  RAISE NOTICE 'Number of records: %', len;

  RAISE NOTICE 'Transaction ID: %', TXID_CURRENT();

  -- results in unique constraint violation
  UPDATE xxx SET id = 3;
END;
$$ LANGUAGE plpgsql;

然后尝试调用f() from psql.

stackoverflow=# show autocommit;
 autocommit 
------------
 on
(1 row)

stackoverflow=# SELECT f();
NOTICE:  Transaction ID: 15086
NOTICE:  Transaction ID: 15086
NOTICE:  Transaction ID: 15086
NOTICE:  Number of records: 2
NOTICE:  Transaction ID: 15086
ERROR:  duplicate key value violates unique constraint "xxx_pkey"
DETAIL:  Key (id)=(3) already exists.
CONTEXT:  SQL statement "UPDATE xxx SET id = 3"
PL/pgSQL function f() line 20 at SQL statement

stackoverflow=# SELECT * FROM xxx;
id 
----
(0 rows)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 postgreSQL 存储过程作为一个事务执行 的相关文章

随机推荐

  • 训练时间最短的人脸检测算法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 想问是否有任何适合视频的人脸检测方案需要最少的训练时间 理想情况下是几天而不是像 Viola Jones 那样的几周 我读过有关 LB
  • 将值添加到 MassTransit.RabbitMq 中的标头

    我正在使用 MassTransit 3 0 0 0 我很难理解如何在请求 响应场景中拦截消息 并将一些信息添加到我可以在接收器端读取的标头字段 我正在看中间件 http masstransit project com MassTransit
  • Java OCR 库有推荐吗? [复制]

    这个问题在这里已经有答案了 我需要检查大量图片 看看它们是否有关键字 谁能推荐一个好的 可靠的 OCR 库 我很乐意牺牲速度来换取准确性 没有纯 Java OCR 库具有与准确性有关的事情 https stackoverflow com q
  • Microsoft 桌面搜索 - 包含在 Windows Server 2008 上不返回结果

    我正在尝试搜索远程文件共享 运行 Windows Server 2008 R2 对于包含一些文本的文件 如果我尝试这样做 效果很好 SELECT System FileName FROM RemoteServer SystemIndex W
  • 在 TensorFlow 中,有什么方法可以初始化未初始化的变量吗?

    TensorFlow 中初始化变量的标准方法是 init tf initialize all variables sess tf Session sess run init 经过一段时间的学习后 我创建了一组新的变量 但是一旦初始化它们 它
  • window.opener 不对

    我正在打开一个弹出窗口 并希望在其中执行单击操作 从而在打开它的页面中执行一些 jQuery 我在网上找到的所有内容都表明我应该能够使用 window opener 做到这一点 例如JQuery 写入开启器窗口 https stackove
  • jQueryeach() 闭包 - 如何访问外部变量

    从 each 中访问 this rules 变量的最佳方法是什么 任何关于原因 方式的解释也会有帮助 app Style function node this style node this rules var ruleHolder nod
  • 为什么perl配置VC-WIN64A后没有ms\do_ms.bat?

    我正在使用 Visual Studio 2015 编译 OpenSSL 我已经安装了 Windows 10 上的 Visual Studio 2015 ActivePerl 5 24 0 2400 MSWin32 x64 300558 na
  • 如何在不使用非 api 类的情况下取消 Java 中的 Files.copy() ?

    我正在下载一个文件Files copy method Files copy in Paths get targetZipFile StandardCopyOption REPLACE EXISTING 如果下载很慢我想取消它 我在 stac
  • gcov 在当前目录中创建 .gcov 文件。有什么办法可以改变这个吗?

    我在 RHEL 上运行 gcov gcc 4 1 2 当我想为 gcov 文件指定目录时 关于如何做到这一点有什么想法吗 从您想要创建其文件的目录运行 gcov 你必须使用 o参数告诉它在哪里查找 gcno gcda 文件 看gcov 的文
  • 是什么让 SPI 比 I2C 协议更快 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我了解 I2C 和 SPI 通信的基础知识 因为两者都是同步协议 我想知道是什么让 SPI 比 I2C 更快 如果我没记错的话 使用 I2
  • Docker:理解ENTRYPOINT和CMD指令

    我想问一些关于ENTRYPOINT and CMD可在 Dockerfile 中使用的说明 Providing that I m mounting local directories as volumes in a container us
  • 如何检查我当前是否在主屏幕上

    是否可以检查我的应用程序当前是否处于后台并且主屏幕是否已启动 没有 API 可以知道主屏幕是否正在显示 但是 您可以使用各种 Activity 生命周期回调 onStop 等 知道您的应用程序何时发送到后台
  • 为什么未装箱的数组不是可折叠的实例?

    在 Haskell 中找出要使用的正确数据容器可能有点棘手 对于我认为使用的 2D 网格应用程序UArray会是合适的 然而 据我所知UArray不是一个实例foldable 不在Data Array IArray nor Data Arr
  • Flutter SQFlite 一对多关系设置

    我正在创建一个应用程序并需要一个数据库 该数据库包含位置表和兴趣点表 这是一对多的关系 一个位置有多个兴趣点 现在我尝试用 sqflite 在 flutter 中建立这种关系 但失败了 我已经尝试添加外键 但没有成功 这只是代码中最重要的部
  • RecyclerView ViewHolder 内部 ConstraintLayout 的性能

    在过去的两天里 我一直在尝试分类为什么我的 RecyclerView 在滚动时速度如此之慢 并且我已将其范围缩小到我用于行的 ConstraintLayout 在 Android 上使用 GPU 分析器会显示绿色 蓝绿色条一直到屏幕顶部 表
  • 使用 XmlSlurper 解析(非常)大的 XML 文件

    我对 Groovy 有点陌生 我正在尝试使用 XmlSlurper 读取一个 相当 大的 XML 文件 超过 1Gb 由于它不构建整个 DOM 因此它应该能够在处理大文件时产生奇迹 在记忆中 尽管如此 我还是不断收到 OutOfMemory
  • 在 PL/pgSQL 函数中拆分逗号分隔的字符串

    我正在尝试编写一个函数 该函数将 ID 作为输入并更新该给定 ID 上的一些字段 到目前为止 它看起来像这样 CREATE FUNCTION update status p id character varying p status cha
  • 如何在 Laravel 中解密哈希密码

    我用谷歌搜索了很多 但不幸的是没有找到有效的解决方案 我知道这是一种糟糕的技术 但我需要通过电子邮件向用户发送密码 我已设法发送用户哈希密码 但我无法解密该密码 以下是我正在使用的程序 results DB select select fr
  • 将 postgreSQL 存储过程作为一个事务执行

    我正在使用 PostgreSQL 9 3 并且创建了一些包含多个语句的存储过程 我在准备好的语句的帮助下在 Java 应用程序中调用此存储过程 现在我读到存储过程中的每个语句都作为一个事务执行 即每个语句后一次提交 但我想要的是将整个存储过