PostgreSQL:回滚 plpgsql 函数内的事务?

标签 postgresql transactions plpgsql

来自 MS SQL 世界,我倾向于大量使用存储过程。我目前正在编写一个使用大量 PostgreSQL plpgsql 函数的应用程序。我想做的是回滚包含在特定函数中的所有 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;

最佳答案

一个函数确实代表一个事务。您不必将函数包装在 BEGIN/COMMIT 中。

关于PostgreSQL:回滚 plpgsql 函数内的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2422205/

相关文章:

postgresql - 执行动态交叉表查询

java - Spring:如何在 PostgreSQL 中使用 KeyHolder

sql - postgresql - json 对象的键/值查找

java - 如何使 RestController 具有事务性?

sql - 如何在函数的 UPDATE 或 SELECT 语句中使用动态列名?

postgresql - 如何在 IF-THEN-ENDIF 条件下使用存储过程返回 bool 值?

postgresql - 在仍有许多事件事务的同时执行 pg_dump

postgresql - 动态改变 PL/pgSQL RECORD 列的值

database - Codeigniter,事务中的错误跟踪

postgresql - 读取由 postgresql 函数创建的未提交行?