postgres与BEGIN的功能和交易

问题描述 投票:3回答:1

我对postgres函数和事务的工作方式有一些疑问。

目前我的功能如下:

CREATE OR REPLACE FUNCTION test_function(some_id character varying)
    RETURNS character varying AS
$BODY$
BEGIN
    S1;
    S2;
    S3;
    .
    .
    Sn;
RETURN some_id;
END; $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

这些陈述可以是基于INSERTUPDATESELECT或plain some_id查询。正如我从postgre documentation所理解的那样,此函数中的所有语句都作为单个事务执行并在END处提交。

我的问题是:

  1. 如果让我们说S1成功但S2失败,S1会被承诺吗?
  2. 我的理解是,BEGIN之后的所有陈述都是作为单一交易执行的,对吗?
  3. 如果在COMMIT之前没有明确的END并且所有语句都成功,那么无论autocommit = on / off,交易都会被提交吗?
  4. 让我们说S1, S2, S3都是INSERT声明。 S1S2成功但是S3失败了,在没有明确的S1, S2声明的情况下,ROLLBACK的插入是否会被撤销?

谢谢!

postgresql postgresql-9.4 postgresql-9.5
1个回答
2
投票

答案数量:

  1. 没有;如果S2失败,则整个事务中止并且只能回滚。
  2. 可能存在误解。启动事务的SQL语句BEGIN与启动PL / pgSQL块的BEGIN完全不同。后者不会开始交易。 如果没有明确的SQL命令BEGIN,则每个语句都在其自己的事务中运行(“autocommit”)。 函数中的所有语句都在单个事务中执行。
  3. 你不能在函数中使用COMMIT(或ROLLBACK)。
  4. 是。这是与1.相同的问题,只是否定的。
© www.soinside.com 2019 - 2024. All rights reserved.