如何在PostgreSQL中实现“BEGIN ATOMIC”

3

Sybase BEGIN ATOMIC在PostgreSQL中的等效语句是什么?

它应该类似于:

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

三个更新语句必须一起成功或一起失败。

Postgres中的函数不能启动或结束事务。函数的调用者需要启动和结束事务。如果您确实需要此功能,则必须升级到Postgres 11,其中引入了可以控制事务的存储过程。 - user330315
我正在处理版本11。 - ZORRO_BLANCO
然后使用一个过程,而不是一个函数。有关详细信息,请参阅手册 - user330315
好的,谢谢! - ZORRO_BLANCO
1个回答

1
三个更新语句必须作为一个整体成功或失败。
问题下面的评论是一种误解。每个Postgres函数都是事务性的,总是作为一个整体成功或失败。只有在相反的情况下才需要一个PROCEDURE:提交已在过程体内完成的内容。
字面上的CLAUSE 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;

请参见:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接