我对 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 了解到文档 https://www.postgresql.org/docs/9.5/static/sql-begin.html,此函数中的所有语句都作为单个事务执行并在 END 时提交。
我的问题是:
- 如果可以说
S1
是成功的但是S2
失败,将S1
承诺吗?
- 我的理解是,之后的所有陈述
BEGIN
作为单个事务执行,对吗?
- 在没有明确说明的情况下
COMMIT
before END
并且所有语句都成功,无论 autocommit = on/off 是否都会提交事务?
- 可以说
S1, S2, S3
都是INSERT
声明。S1
and S2
成功但是S3
失败,将插入S1, S2
在没有明确说明的情况下可以逆转ROLLBACK
陈述?
谢谢你!
按编号回答:
No; if S2
失败,整个事务被中止,只能回滚。
-
很可能存在误会。 SQL语句BEGIN
启动交易与启动交易完全不同BEGIN
启动 PL/pgSQL 块。后者确实not开始交易。
如果没有明确的 SQL 命令BEGIN
,每个语句都在自己的事务中运行(“自动提交”)。
函数中的所有语句都在单个事务中执行。
你不能有COMMIT
(or ROLLBACK
)在一个函数中。
是的。这与1. 是同一个问题,只是是否定的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)