«ОШИБКА: недопустимое завершение транзакции» при попытке выполнить процедуру с вложенным управлением транзакциями - PullRequest
0 голосов
/ 08 ноября 2018

В соответствии с документацией (https://www.postgresql.org/docs/current/app-psql.html), даже при отключенном AUTOCOMMIT PSQL выдает неявный BEGIN непосредственно перед любой командой, которая еще не находится в блоке транзакции и сама не является BEGIN или другая команда управления транзакциями, или команда, которая не может быть выполнена внутри блока транзакции, например VACUUM. (К сожалению, CALL не обрабатывается так же, как VACCUM). И, согласно Шону Томасу (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;

Ошибка в операторе commit; это работает, если я закомментирую это.

1 Ответ

0 голосов
/ 09 ноября 2018

Удалить предложение SET. По документации:

Если к процедуре добавлено предложение SET, то эта процедура не может выполнять операторы управления транзакциями (например, COMMIT и ROLLBACK, в зависимости от языка).

...