我正在处理应用数据库架构更新的脚本.我使用start transaction/commit设置了所有SQL更新脚本.我在命令行上将这些脚本传递给psql.
我现在需要在一个事务中同时应用多个脚本.到目前为止,我提出的唯一解决方案是从原始脚本集中删除启动事务/提交,然后在新的启动事务/提交块中将它们一起阻塞.我正在编写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)
也许这会帮助你一点点.