【问题标题】:Nested transactions in postgresql 8.2?postgresql 8.2中的嵌套事务?
【发布时间】:2010-09-17 07:14:09
【问题描述】:

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

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

实际上我想要嵌套事务,但我不知道如何在 postgresql 中执行此操作。

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

【问题讨论】:

    标签: sql postgresql transactions


    【解决方案1】:

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

    也许这会对你有所帮助。

    【讨论】:

    • 要在这种情况下使用保存点,我必须修改我现有的脚本以及它们的运行方式。在这种特殊情况下,如果要这样做,我只需从我的所有脚本中删除开始/结束事务块并单独添加它,这样就可以轻松地同时执行多个。谢谢!
    【解决方案2】:

    我最终“解决”了我的问题 - 我使用 perl 脚本重新处理输入脚本以消除它们的启动事务/提交调用,然后将它们全部推送到一个文件中,该文件拥有它自己开始事务/提交。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2014-12-12
      • 2016-09-10
      • 2016-03-01
      • 1970-01-01
      相关资源
      最近更新 更多