Наша база данных в 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.