У меня есть функция Postgresql, которая должна ВСТАВИТЬ около 1,5 миллиона данных в таблицу. Я хочу, чтобы я увидел, что таблица заполняется каждой вставкой записей. В настоящее время, что происходит, когда я пытаюсь сказать около 1000 записей, get заполняется только после того, как будет выполнена полная функция. Если я остановлю функцию на полпути, данные не будут заполнены. Как я могу сделать запись совершенной, даже если я остановлюсь после того, как определенное количество записей было вставлено?
Выполнение транзакций при выполнении функции postgreql
Ответ 1
Это можно сделать с помощью 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;
Ответ 2
То, о чем вы просите, обычно называется автономной транзакцией.
PostgreSQL не поддерживает автономные транзакции в это время (9.4).
Для правильной поддержки им действительно нужны хранимые процедуры, а не только определенные пользователем функции, которые в настоящее время поддерживаются. Также очень сложно реализовать автономный tx в PostgreSQL для множества внутренних причин, связанных с его сеансом и моделью процесса.
В настоящее время используйте dblink, как было предложено Бобом.
Ответ 3
Для Postgresql 9.5 или новее вы можете использовать динамических фоновых работников, предоставляемых расширением pg_background. Он создает автономную транзакцию. Пожалуйста, обратитесь к странице github расширения. Решение лучше, чем db_link. Существует полное руководство по Автономная поддержка транзакций в PostgreSQL. Существует третий способ начать автономную транзакцию в Postgres, но некоторые исправления нуждаются. Пожалуйста, см. Предложение Peter Eisentraut исправление для транзакций в стиле OracleDB.