我对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
的UPDATE
,SELECT
或plain some_id
查询。正如我从postgre documentation所理解的那样,此函数中的所有语句都作为单个事务执行并在END处提交。
我的问题是:
S1
成功但S2
失败,S1
会被承诺吗?BEGIN
之后的所有陈述都是作为单一交易执行的,对吗?COMMIT
之前没有明确的END
并且所有语句都成功,那么无论autocommit = on / off,交易都会被提交吗?S1, S2, S3
都是INSERT
声明。 S1
和S2
成功但是S3
失败了,在没有明确的S1, S2
声明的情况下,ROLLBACK
的插入是否会被撤销?谢谢!
答案数量:
S2
失败,则整个事务中止并且只能回滚。BEGIN
与启动PL / pgSQL块的BEGIN
完全不同。后者不会开始交易。
如果没有明确的SQL命令BEGIN
,则每个语句都在其自己的事务中运行(“autocommit”)。
函数中的所有语句都在单个事务中执行。COMMIT
(或ROLLBACK
)。