sql - postgresql 8.2 中的嵌套事务?

标签 sql postgresql transactions

我正在研究应用数据库架构更新的脚本。我已经使用启动事务/提交设置了我所有的 SQL 更新脚本。我在命令行上将这些脚本传递给 psql。

我现在需要在一个事务中同时应用多个脚本。到目前为止,我想出的唯一解决方案是从原始脚本集中删除开始事务/提交,然后将它们一起塞入一个新的开始事务/提交 block 中。我正在编写 perl 脚本来即时执行此操作。

实际上我想要嵌套事务,但我不知道如何在 postgresql 中实现。

有没有办法为此目的做或模拟嵌套事务?我已将事情设置为在出现任何错误时自动退出,因此如果任何较低级别的交易失败,我不需要继续进行顶级交易。

最佳答案

好吧,您可以使用 SavePoints 在 postgresql 中使用嵌套事务。

以这段代码为例:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

也许这会对您有所帮助。

关于sql - postgresql 8.2 中的嵌套事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/204557/

相关文章:

transactions - 三阶段提交协议(protocol)(3PC)如何保证原子性?

entity-framework - 处理非身份主键的生成

symfony - Doctrine setAutoCommit(false) 方法和 "there is no active transaction"消息

mysql - 如何更新一系列行号的列?

mysql - 依赖 DISTINCT 的几个字段只能在 MySQL 上工作吗?

SQL Server : how to combine two select queries from the same table and take the result on Column

regex - Postgres 正则表达式问题

postgresql - 锁定一张表,一次只有一个用户可以更新它

sql - SQL 查询中 INSERT、DELETE 和 UPDATE 的逻辑查询处理阶段

sql - 用于所有应用程序范围的授权和身份验证 Web 服务的通用数据库设计