plv8 на Postgres 9.6: предыдущие результаты INSERT недоступны позже - PullRequest
0 голосов
/ 28 июня 2018

Наша база данных в 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 вызывает функцию Б и т. Д.

В определенный момент в функции Z я хочу получить запись, которую я вставил в функцию A (идентификатор передается через параметры) - и ее там нет. То же самое иногда случается с UPDATE: я запускаю обновление в функции A, а в функции Z я хочу получить новое содержимое - однако содержимое является старым - как если бы оператор UPDATE в функции A никогда не выполнялся.

Все работает нормально, если я разделю все это на отдельные операторы: если функция B не вызывается из функции A, а вызывается как

SELECT function_A();
SELECT function_B();

тогда все всегда в порядке, но в моем случае такой подход невозможен.

Однако я не могу выделить это явление. Иногда это просто происходит в определенных местах. Если это произойдет, то в этот момент это воспроизводимо.

* Версия 1024 * plv8 - 1.4.8.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...