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.

0 ответов

Другие вопросы по тегам