Я работаю над функцией PL/pgSQL «interpolate_values» с некоторыми трудоемкими вычислениями. Стол под названием «interpolation_jobs» содержит информацию наблюдения о каждом вызове функции, например, что прогресс вызова функции с заданной job_id должен быть наблюдаемаНемедленное обновление в функциях PL/pgSQL
SELECT status FROM interpolation_jobs WHERE id = job_id;
В столбце «Статус» содержит одно из значений «очередь» , 'running' или 'done'. В начале функции, статус изменяется с «очереди» на «работает», в конце концов, это установлено в «сделано»:
CREATE OR REPLACE FUNCTION interpolate_values (job_id INTEGER)
RETURNS VOID
LANGUAGE plpgsql VOLATILE
AS $$
DECLARE
BEGIN
EXECUTE 'UPDATE interpolation_jobs
SET status = ''running'', progress = 0.0
WHERE id = ' || job_id || ';';
--
-- ... some extensive database computations ...
--
EXECUTE 'UPDATE interpolation_jobs
SET status = ''done''
WHERE id = ' || job_id || ';';
END;
$$;
Моя проблема заключается в том, что статус не обновляется во время выполнения функции вызов. Обновления на самом деле происходят, когда возвращается вызов функции. Таким образом, статус напрямую изменяется от «поставленного в очередь» до «сделано». Линии
EXECUTE 'UPDATE interpolation_jobs
SET status = ''running'', progress = 0.0
WHERE id = ' || job_id || ';';
не действуют.
Возможно ли обновить значения немедленно в PL/pgSQL, чтобы новые значения были доступны до вызова функции?
Спасибо!
EDIT:
Спасибо за все ваши ответы, которые помогли мне многое понять общие проблемы асинхронных операций базы данных. Подход dblink работает для меня. Не нужно указать IP/Port/User, если используется та же база данных:
SELECT * FROM current_database() INTO _db_name;
PERFORM dblink_connect('dbname=' || _db_name);
PERFORM dblink_exec('UPDATE interpolation_jobs SET status = ''running'' WHERE id =' || _job_id);
--
-- ... some extensive database computations ...
--
PERFORM dblink_exec('UPDATE interpolation_jobs SET status = ''done'' WHERE id =' || _job_id);
PERFORM dblink_disconnect();
Короче говоря: нет. Обновления таблицы состояния являются частью транзакции и могут рассматриваться только другими процессами после совершения транзакции. Вам потребуется асинхронное уведомление, чтобы выполнить то, что вы хотите. см. «LISTEN» или «NOTIFY» в прекрасном руководстве. – wildplasser