如何在 PostgreSQL 中实现`BEGIN ATOMIC`

问题描述 投票:0回答:2

PostgreSQL 中的 Sybase

BEGIN ATOMIC
相当于什么?

应该是这样的:

create or replace function my_func()
returns int
as $$ 
begin 
    begin atomic
        update stetment1;
        update stetment2;
        update stetment3;
    end;
end;
$$ LANGUAGE PLPGSQL;

这三个更新语句必须同时成功或失败。

postgresql function transactions atomic postgresql-11
2个回答
1
投票

这三个更新语句必须同时成功或失败..

问题下面的评论是一个误解。 每个Postgres 函数都是事务性的,并且总是要么成功要么失败。您只需要一个

PROCEDURE
即可实现相反的效果:提交过程体内已经完成的操作。

文字子句

BEGIN ATOMIC
用于新的标准 SQL
CREATE FUNCTION
语法,该语法最终已随 Postgres 14 添加。但它与任何其他 Postgres 函数一样“原子”。

无论哪种方式,使用新语法你都可以编写:

CREATE OR REPLACE FUNCTION my_func()
  LANGUAGE plpgsql
  RETURNS void  -- since you are not returning anything
BEGIN ATOMIC
   update stetment1;
   update stetment2;
   update stetment3:
END;

参见:


0
投票

您可以使用BEGIN ATOMIC; ... 结尾; PostgreSQL 中的语句如下所示。 *

BEGIN ATOMIC; ... END;
语句仅适用于
LANGUAGE SQL
,根据文档我的答案给出了一些带有
BEGIN ATOMIC; ... END;
语句的示例:

CREATE FUNCTION my_func() RETURNS INTEGER LANGUAGE SQL
BEGIN ATOMIC; -- Here
SELECT 2 + 3;
END; -- Here

实际上,不使用如下所示的

BEGIN ATOMIC; ... END;
语句与上面相同,因为在PostgreSQL中,
BEGIN ATOMIC; ... END;
语句没有什么特别的,它只是一种语法,实际上在PostgreSQL中,一个函数会在事务中自动运行来回滚,如果有错误:

CREATE FUNCTION addition(value INTEGER) RETURNS INTEGER AS $$
SELECT 2 + 3;
$$ LANGUAGE SQL;
© www.soinside.com 2019 - 2024. All rights reserved.