MS SQLの世界から来た私は、ストアドプロシージャを多用する傾向があります。私は現在、多くのPostgreSQLplpgsql関数を使用するアプリケーションを作成しています。私がやりたいのは、特定の関数内のいずれかの時点で例外が発生した場合に、特定の関数内に含まれるすべてのINSERTS/UPDATESをロールバックすることです。
私は当初、各関数が独自のトランザクションにラップされており、例外によってすべてが自動的にロールバックされるという印象を受けました。しかし、そうではないようです。代わりに、例外処理と組み合わせてセーブポイントを使用する必要があるかどうか疑問に思っていますか?しかし、これが最善のアプローチであるかどうかを知るために、トランザクションとセーブポイントの違いを本当に理解していません。何かアドバイスはありますか?
CREATE OR REPLACE FUNCTION do_something(
_an_input_var int
) RETURNS bool AS $$
DECLARE
_a_variable int;
BEGIN
INSERT INTO tableA (col1, col2, col3)
VALUES (0, 1, 2);
INSERT INTO tableB (col1, col2, col3)
VALUES (0, 1, 'whoops! not an integer');
-- The exception will cause the function to bomb, but the values
-- inserted into "tableA" are not rolled back.
RETURN True;
END; $$ LANGUAGE plpgsql;