Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 在执行postgreql函数时提交事务_Function_Postgresql_Commit - Fatal编程技术网

Function 在执行postgreql函数时提交事务

Function 在执行postgreql函数时提交事务,function,postgresql,commit,Function,Postgresql,Commit,我有一个Postgresql函数,它必须向一个表中插入大约150万个数据。我想看到的是,表中的每一条记录都被填充。目前,当我尝试使用大约1000条记录时,只有在执行完完整的函数后,才会填充get。如果中途停止函数,则不会填充任何数据。即使在插入一定数量的记录后停止,我如何使记录提交?这可以使用dblink完成。我展示了一个示例,其中提交了一个插入,您需要添加while循环逻辑并提交每个循环。你可以 您所要求的通常称为自治事务 PostgreSQL目前不支持自治事务(9.4) 为了正确地支持它们,

我有一个Postgresql函数,它必须向一个表中插入大约150万个数据。我想看到的是,表中的每一条记录都被填充。目前,当我尝试使用大约1000条记录时,只有在执行完完整的函数后,才会填充get。如果中途停止函数,则不会填充任何数据。即使在插入一定数量的记录后停止,我如何使记录提交?

这可以使用dblink完成。我展示了一个示例,其中提交了一个插入,您需要添加while循环逻辑并提交每个循环。你可以


您所要求的通常称为自治事务

PostgreSQL目前不支持自治事务(9.4)

为了正确地支持它们,它确实需要存储过程,而不仅仅是它当前支持的用户定义函数。在PostgreSQL中实现自治tx也是非常复杂的,因为与会话和流程模型相关的各种内部原因


现在,按照Bob的建议使用dblink。

对于Postgresql 9.5或更高版本,您可以使用pg_后台扩展提供的动态后台工作程序。它创建自治事务。请参阅分机的名称。该解决方案优于db_链接。这本书有完整的指南。在Postgres中有第三种启动自主事务的方法,但需要一些修补程序。有关OracleDB样式的事务,请参阅Peter的EICentrut。

如果您可以灵活地从一个函数更改为另一个过程,从Postgresql 12开始,如果您使用过程而不是调用命令调用的函数,则可以执行内部提交。因此,您的函数将更改为过程,并使用CALL命令调用:例如:

    CREATE PROCEDURE transaction_test2()
    LANGUAGE plpgsql
    AS $$
    DECLARE
     r RECORD;
    BEGIN
      FOR r IN SELECT * FROM test2 ORDER BY x LOOP
        INSERT INTO test1 (a) VALUES (r.x);
        COMMIT;
      END LOOP;
    END;
    $$;

    CALL transaction_test2();

有关Postgres事务管理的更多详细信息,请参见此处:

我通常仅在登录时使用此方法。除了日志记录之外,这通常不是进行批量提交的正确方法,但我将让您根据您的用例来决定。dblink是否可用于postgresql 9.2?是的,您应该能够执行创建扩展dblink;从作为postgres用户连接的SQL会话进行测试。感谢您的帮助。。我将尝试一下。@Bob当您希望每隔一段时间提交以避免丢失工作(以及时间)时,它对于长时间运行的加载/转换/生成过程也很有用。有人可能会说,这属于应用层(或shell脚本或其他),但有时我必须手动完成这类工作,并且非常希望在DB中使用更轻量级的方法来完成这项工作
    CREATE PROCEDURE transaction_test2()
    LANGUAGE plpgsql
    AS $$
    DECLARE
     r RECORD;
    BEGIN
      FOR r IN SELECT * FROM test2 ORDER BY x LOOP
        INSERT INTO test1 (a) VALUES (r.x);
        COMMIT;
      END LOOP;
    END;
    $$;

    CALL transaction_test2();