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

标签 postgresql jdbc transactions commit autocommit

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

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

我该怎么做?也许在 JDBC 级别停用自动提交?

最佳答案

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

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;

然后尝试从 psql 调用 f()

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)

关于postgresql - 将 postgreSQL 存储过程作为一个事务执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26406111/

相关文章:

regex - 从字符串字段中提取数字,包括小数 (Postgres 9.5)

mysql - Web 应用程序中的数据库连接

sql - PostgreSQL - 动态值作为表名

java - 为我正在使用的每个项目创建 Spring @Repository 和 @Controller (来自数据库)

java - 没有结果时 executeQuery(String sql) 返回什么?

sql - Oracle 数据库在 UPDATE 查询中无限挂起

rest - MarkLogic v1/由 REST API 创建的交易

c# - sitecore 插入项目数据完整性

ruby-on-rails - Rails - Active Record 查询不查询变量赋值(想要立即加载)

java - ArrayList 的行为非常奇怪