与BEGIN

时间:2018-02-28 19:31:23

标签: postgresql postgresql-9.4 postgresql-9.5

我对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;

语句可以基于INSERT UPDATESELECT或普通some_id查询。据我所知,postgre documentation中,此函数中的所有语句都作为单个事务执行,并在END处提交。

我的问题是:

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

1 个答案:

答案 0 :(得分:2)

答案号码:

  1. 没有;如果S2失败,则整个事务将中止,并且只能回滚。

  2. 可能存在误解。启动事务的SQL语句BEGIN与启动PL / pgSQL块的BEGIN完全不同。后者开始交易。

    如果没有明确的SQL命令BEGIN,则每个语句都在自己的事务中运行(“autocommit”)。

    函数中的所有语句都在一个事务中执行。

  3. 您不能在函数中拥有COMMIT(或ROLLBACK)。

  4. 是。这是与1.相同的问题,仅在否定中。