我对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
或普通some_id
查询。据我所知,postgre documentation中,此函数中的所有语句都作为单个事务执行,并在END处提交。
我的问题是:
S1
成功但S2
失败,S1
会被提交吗?BEGIN
之后的所有语句都是作为单个trasaction执行的,对吗?COMMIT
之前没有明确的END
并且所有语句都成功,那么无论autocommit = on / off,都会提交事务吗?S1, S2, S3
是所有INSERT
语句。 S1
和S2
成功但S3
失败,S1, S2
中的插入是否会在没有明确ROLLBACK
声明的情况下被撤消?谢谢!
答案 0 :(得分:2)
答案号码:
没有;如果S2
失败,则整个事务将中止,并且只能回滚。
可能存在误解。启动事务的SQL语句BEGIN
与启动PL / pgSQL块的BEGIN
完全不同。后者不开始交易。
如果没有明确的SQL命令BEGIN
,则每个语句都在自己的事务中运行(“autocommit”)。
函数中的所有语句都在一个事务中执行。
您不能在函数中拥有COMMIT
(或ROLLBACK
)。
是。这是与1.相同的问题,仅在否定中。