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

8hhllhi2  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(4)|浏览(267)

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

k4aesqcs

k4aesqcs1#

这可以通过dblink来实现。我展示了一个例子,其中一个插入正在提交,您需要添加while循环逻辑并提交每个循环。你可以http://www.postgresql.org/docs/9.3/static/contrib-dblink-connect.html

CREATE OR REPLACE FUNCTION log_the_dancing(ip_dance_entry text)
RETURNS INT AS
$BODY$
    DECLARE
    BEGIN
        PERFORM dblink_connect('dblink_trans','dbname=sandbox port=5433 user=postgres');
        PERFORM dblink('dblink_trans','INSERT INTO dance_log(dance_entry) SELECT ' || '''' || ip_dance_entry || '''');
        PERFORM dblink('dblink_trans','COMMIT;');
        PERFORM dblink_disconnect('dblink_trans'); 

        RETURN 0;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION log_the_dancing(ip_dance_entry text)
  OWNER TO postgres;

BEGIN TRANSACTION;
  select log_the_dancing('The Flamingo');
  select log_the_dancing('Break Dance');
  select log_the_dancing('Cha Cha');
ROLLBACK TRANSACTION;

--Show records committed even though we rolled back outer transaction
select *
from dance_log;
rjjhvcjd

rjjhvcjd2#

如果您可以灵活地从函数更改为过程,从PostgreSQL 12开始,如果您使用过程而不是函数,则可以通过CALL命令调用内部提交。因此,您的函数将被更改为过程并使用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事务管理的更多详细信息,请访问:https://www.postgresql.org/docs/12/plpgsql-transactions.html

oipij1gg

oipij1gg3#

你所要求的通常被称为“自主交易”。
PostgreSQL目前不支持自治事务(9.4)。
为了正确地支持它们,它确实需要存储过程,而不仅仅是它当前支持的用户定义函数。在PostgreSQL中实现自治tx也非常复杂,这是由于与其会话和进程模型相关的各种内部原因。
现在,按照Bob的建议使用dblink。

7bsow1i6

7bsow1i64#

对于Postgresql 9.5或更高版本,您可以使用pg_background扩展提供的动态后台工作程序。它创建自主交易。请参阅扩展名的github page。这个解决方案比db_link更好。在Autonomous transaction support in PostgreSQL上有一个完整的指南。在Postgres中还有第三种启动自治事务的方法,但尼德一些修补。有关OracleDB风格的事务,请参阅Peter的Eisentraut patch proposal

相关问题