11

我正在研究应用数据库模式更新的脚本。我已经使用 start transaction/commit 设置了我的所有 SQL 更新脚本。我在命令行上将这些脚本传递给 psql。

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

实际上,我想要嵌套事务,我无法弄清楚如何在 postgresql 中执行。

有没有办法为此目的执行或模拟嵌套事务?我已经设置了自动解决任何错误的东西,所以如果任何较低的交易失败,我不需要继续进行顶级交易。

4

2 回答 2

6

好吧,您可以使用 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)

也许这会对你有所帮助。

于 2008-10-15T12:56:18.070 回答
0

我最终在带外“解决”了我的问题 - 我使用 perl 脚本重新处理输入脚本以消除它们的启动事务/提交调用,然后将它们全部推送到一个文件中,从而获得它自己的启动事务/犯罪。

于 2008-10-16T14:25:08.250 回答