来自MS SQL世界,我倾向于大量使用存储过程。我目前正在编写一个应用程序,它使用了很多PostgreSQL plpgsql函数。我想要做的就是回滚特定函数中包含的所有INSERT/UPDATES,如果我在其中的任何位置发生异常。PostgreSQL:回滚plpgsql函数中的事务?
我最初的印象是,每个函数都包含在自己的事务中,并且异常会自动回滚所有内容。但是,情况似乎并非如此。我想知道是否应该将保存点与异常处理结合使用呢?但我并不真正理解事务和保存点之间的区别,以了解这是否是最佳方法。有什么建议吗?
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;
你可以发布一个函数的例子,不会像你期望的那样回滚一切吗?在调用语句的事务上下文中执行PL/pgSQL函数* do *,但BEGIN..EXCEPTION块可以修改该行为。没有看到一个例子,很难给出适当的建议。 – 2010-03-11 18:19:40
编辑添加示例。谢谢。 – jamieb 2010-03-11 18:33:52
我正在运行8.4.2,创建tableA和B,每个都有三个int列,运行您的示例(在INSERT INTO tableB行结束时删除“;”)并将其轰炸。我检查了两张桌子,他们都是空的。我甚至在两者之间添加了一些调试代码来验证记录在失败之前是否存在,然后在失败之后失效。 – 2010-03-11 19:00:03