plv8 на Postgres 9.6: предыдущие результаты INSERT недоступны позже
Наша база данных в PostgreSQL 9.6 состоит из очень сложной структуры из сотен функций PostgreSQL, большинство из которых написаны на plv8/JavaScript (если эта структура имеет смысл, это другой вопрос. Но о полной переписке сейчас не может быть и речи).
Проблема в том, что запись, записанная в таблицу, иногда недоступна при попытке доступа к ней позже.
Рассмотрим фрагмент кода ниже:
DROP TABLE IF EXISTS my_temp;
CREATE TABLE my_temp(id bigint, foo text);
DO $$
plv8.execute("INSERT INTO my_temp(id,foo) VALUES($1,$2)",[1,'foo1']);
var fetchRow = plv8.execute("SELECT * FROM my_temp WHERE id = $1",[1]);
plv8.elog(INFO,fetchRow[0].foo);
$$ LANGUAGE plv8;
Это работает, как ожидалось, INFO: foo1
потушен
Тем не менее, представьте, что это не происходит в одном утверждении (и особенно не в DO
блок, это просто для демонстрации принципа), но вместо этого рассмотрим, что задействованы десятки функций, функция A вызывает функцию B и так далее.
В определенный момент в функции Z I я хочу получить запись, которую я вставил в функцию A (идентификатор передается через параметры) - и ее там нет. То же самое иногда случается с UPDATE
: Я запускаю обновление в функции A и в функции Z. Я хочу получить новый контент - Однако контент является старым - как будто UPDATE
Оператор в функции A никогда не выполнялся.
Все работает нормально, если я разделю все на отдельные операторы: если функция B не вызывается из функции A, а вызывается как
SELECT function_A();
SELECT function_B();
тогда все всегда хорошо, но такой подход не осуществим в моем случае.
Однако я не могу выделить это явление. Иногда это просто происходит в определенных местах. Если это произойдет, это воспроизводимо в этой точке.
Используемая версия plv8 - 1.4.8.