Выполнение транзакций при выполнении функции postgreql - программирование
Подтвердить что ты не робот

Выполнение транзакций при выполнении функции postgreql

У меня есть функция Postgresql, которая должна ВСТАВИТЬ около 1,5 миллиона данных в таблицу. Я хочу, чтобы я увидел, что таблица заполняется каждой вставкой записей. В настоящее время, что происходит, когда я пытаюсь сказать около 1000 записей, get заполняется только после того, как будет выполнена полная функция. Если я остановлю функцию на полпути, данные не будут заполнены. Как я могу сделать запись совершенной, даже если я остановлюсь после того, как определенное количество записей было вставлено?

4b9b3361

Ответ 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.