Отменить транзакцию функции, которая вызывается в другой функции - PullRequest
0 голосов
/ 08 апреля 2019

Я использовал функции postgres и plpgsql для реализации бизнес-логики веб-приложения.

Мое промежуточное программное обеспечение вызывает plpgsql - функции.Эти plpgsql-функции вызывают другие функции plpgsql, которые выполняют транзакции, такие как обновления, вставки, удаления и т. Д.

Я добавил ниже псевдокод, чтобы проиллюстрировать логику.

Предположим, sub_function_1 и sub_function_2 выполняются без ошибок.sub_function_3 выдает ошибку и сталкивается с исключением.

Поскольку транзакции sub_function_1 и sub_function_2 имеют смысл только в том случае, если sub_function_3 также выполняется без ошибки, я хотел бы выполнить откат для транзакции sub_function_1 и sub_function_2, если sub_function_3 приводит к ошибке.

Можно ли отменить / откатить транзакцию sub_function_1 и sub_function_2 после их успешного выполнения, если sub_function_3 столкнулась с ошибкой?

create or replace function root_function()

begin 

-- do some transactions through performing sub_function_1
perform sub_function_1();

-- do here some other transactions

-- do some transactions through performing sub_function_2
perform sub_function_2();

-- do some transactions through performing sub_function_3
perform sub_function_3();

return 'successful';


exception when others then 

    return 'failed';

end;

1 Ответ

0 голосов
/ 08 апреля 2019

Просто добавьте Rollback в блок Exception в вашей root_function ().Любая ошибка в третьей подфункции приведет к ROLLBACK, которая также отменяет первые две подфункции.

CREATE OR REPLACE FUNCTION root_function()
   RETURNS VOID
   LANGUAGE 'plpgsql'
   AS $$

BEGIN 

-- do some transactions through performing sub_function_1
    PERFORM sub_function_1();

-- do here some other transactions

-- do some transactions through performing sub_function_2
    PERFORM sub_function_2();

-- do some transactions through performing sub_function_3
    PERFORM sub_function_3();

RAISE NOTICE 'successful';


EXCEPTION
   WHEN OTHERS THEN
   ROLLBACK;

END;$$;
...