如何在PostgreSQL中实现`开始ATOMIC`

watbbzwu  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(199)

PostgreSQL中的BEGIN ATOMIC* 的等价物是什么?
它应该是这样的:

CREATE OR REPLACE FUNCTION my_func()
RETURNS int
AS $$ 
BEGIN 
    BEGIN ATOMIC
        UPDATE stetment1;
        UPDATE stetment2;
        UPDATE stetment3;
    END;
END;
$$ LANGUAGE plpgsql;

字符串
这三个update语句必须一起成功或失败。

oxf4rvwz

oxf4rvwz1#

这三个更新语句必须一起成功或失败。
问题下面的注解是一个误解。* 每个 * 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;

字符串
请参阅:

lyr7nygr

lyr7nygr2#

您可以在PostgreSQL中使用BEGIN ATOMIC; ... END; statement,如下所示。* BEGIN ATOMIC; ... END;语句仅适用于LANGUAGE SQL根据the doc,我的答案给出了一些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 my_func(value INTEGER) RETURNS INTEGER AS $$
SELECT 2 + 3;
$$ LANGUAGE SQL;

相关问题