我正在为 PostgreSQL 编写一个脚本,因为我希望它以原子方式执行,所以我将它包装在一个事务中。
我希望脚本看起来像这样:
BEGIN
-- 1) Execute some valid actions;
-- 2) Execute some action that causes an error.
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END; -- A.k.a. COMMIT;
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,pgAdmin 在初始BEGIN. 如果我通过像这样附加分号来终止命令:BEGIN;它会通知我附近的错误EXCEPTION。
我意识到我可能混淆了控制结构和事务的语法,但是我在文档中找不到任何关于如何回滚失败事务的内容(也没有在 SO 中)。
我还考虑过事务可能会在出错时自动回滚,但由于以下脚本,情况似乎并非如此:
BEGIN;
-- 1) Execute some valid actions;
-- 2) Execute some action that causes an error.
COMMIT;
Run Code Online (Sandbox Code Playgroud)
警告我:ERROR: current transaction is aborted, commands ignored until end of transaction block然后我必须手动ROLLBACK;进行交易。
似乎我在这里遗漏了一些基本的东西,但是什么?
编辑:
我也试过DO像这样使用: …