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