尝试使用嵌套事务控制执行过程时出现“错误:无效事务终止”

Jor*_*ins 5 postgresql transactions commit plpgsql postgresql-11

根据文档(https://www.postgresql.org/docs/current/app-psql.html),即使AUTOCOMMIT设置为关闭,PSQL 也会BEGIN在尚未位于事务块中的任何命令之前发出隐式命令本身不是一个BEGIN或其他事务控制命令,也不是不能在事务块内执行的命令,例如VACUUM. (不幸的CALL是,与 的处理方式不同VACCUM)。而且,根据 Shaun Thomas ( https://blog.2ndquadrant.com/pg-phriday-stored-procedures-postgres-11/ ) 的说法,发生无效交易终止错误是因为无法关闭当前交易(在此情况下)情况是由 PSQL 启动的)在过程中。我尝试了所有与事务控制相关的PSQL设置,但都出现无效事务终止错误;即使 PSQL 处理的命令文件仅包含该CALL语句。

这是我调用的程序:

create or replace procedure producto$cargar_imagenes(_super$ bigint, _archivo$ character varying) as $$
declare
    _msg character varying;
    _log rastro_proceso%ROWTYPE;
begin
    perform rastro_proceso_temporal$insert(_super$);
    perform producto$cargar_imagenes$biz(_super$, _archivo$);
    if (_super$ is not null and _super$ > 0) then
        perform producto$cargar_imagenes$log(_super$, _archivo$);
    else
        perform tarea_usuario$private$update(6519204281880642486, null);
    end if;
    commit;
end;
$$ language plpgsql set search_path = public;
Run Code Online (Sandbox Code Playgroud)

它在声明中失败commit;如果我将其注释掉,它就会起作用。

kli*_*lin 6

删除该SET条款。根据文档:

如果 SET 子句附加到过程,则该过程无法执行事务控制语句(例如 COMMIT 和 ROLLBACK,具体取决于语言)。