撤消在另一个函数中调用的函数事务

时间:2019-04-08 16:06:44

标签: postgresql-10

我使用postgres和plpgsql函数实现Web应用程序的业务逻辑。

我的中间件调用plpgsql –函数。 这些plpgsql函数-调用其他plpgsql函数,这些函数执行更新,插入,删除等事务。

我在下面添加了某种伪代码来说明逻辑。

假设执行sub_function_1和sub_function_2没有任何错误。 sub_function_3执行错误并遇到异常。

由于sub_function_1和sub_function_2的事务仅在还执行了sub_function_3且没有错误的情况下才有意义,因此,如果sub_function_3遇到错误,我想对事务sub_function_1和sub_function_2进行回滚。

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 :(得分:0)

只需在root_function()的Exception块中添加Rollback。第三个子函数中的任何错误都将导致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;$$;