我对PostgreSQL函数和事务的工作原理有一些问题。
目前我的函数如下:
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;
这些语句可以是基于
some_id
的INSERT
、UPDATE
或普通的SELECT
查询。根据我从PostgreSQL 文档中了解到的,该函数中的所有语句都将作为单个事务执行,并在最后提交。我的问题是:
- 如果假设
S1
成功但S2
失败,那么S1
会被提交吗? - 我的理解是,在
BEGIN
后的所有语句都将作为单个事务执行,这正确吗? - 如果在
END
前没有显式的COMMIT
,并且所有语句都成功,那么无论自动提交是开启还是关闭,事务是否会被提交? - 假设
S1、S2、S3
都是INSERT
语句。S1
和S2
成功,但S3
失败,如果没有显式的ROLLBACK
语句,那么S1、S2
中的插入操作是否会被撤销?
谢谢!
BEGIN
和END
仅用于将语句分组在函数中,它们不会开始或结束事务。 - khoroshevj