如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?
例如,此事务处理:
CREATE OR REPLACE FUNCTION unfollow(
follower_id uuid,
following_id uuid
)
RETURNS void
LANGUAGE plpgsql
SECURITY INVOKER
AS
$$
BEGIN
PERFORM delete_relationship(
follower_id,
following_id
);
PERFORM decrement_counter(
following_id
);
END;
$$;
仅当两个更新函数都成功时才应提交.当我在被调用的函数中的每个数据库操作中添加一条语句来判断前面的CRUD操作是否成功时,这是有效的,如果不成功,则引发异常.喜欢:
CREATE OR REPLACE FUNCTION delete_relationship(
follower_id uuid,
following_id uuid
)
RETURNS void
LANGUAGE plpgsql
SECURITY INVOKER
AS
$$
BEGIN
DELETE
FROM
following_profiles
WHERE
follower = follower_id
AND following = following_id;
IF NOT FOUND THEN
ROLLBACK;
-- Raise an exception to roll back the transaction
RAISE EXCEPTION 'Error in unfollow_transaction: %', SQLERRM;
END IF;
END;
$$;
如果我不引发异常,事务将提交,即使其中一个子函数失败也会提交.
有没有更聪明的方法来做这件事?如果CRUD操作失败而不每次都提到它,是否有可能使函数在默认情况下引发异常,例如,是否有方法避免编写所有异常语句?