Postgres 9.6上的plv8:先前的INSERT结果以后不再可用

时间:2018-06-28 10:16:55

标签: sql postgresql postgresql-9.6 plv8

我们的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中检索一条插入到函数A中的记录(该ID通过参数传递),但该记录不存在。 有时对于UPDATE也会发生同样的情况:我在函数A和ZI中运行更新以获取新内容-但是,该内容是旧内容-好像函数A中的UPDATE语句具有从未执行过。

如果我将整个事情分解成单独的语句,那么一切都会很好:如果不是从函数A内调用函数B,而是像

那样调用
SELECT function_A();
SELECT function_B();

然后一切都正常,但就我而言,这种方法不可行。

但是,我无法隔离这种现象。有时它只发生在某些地方。如果发生这种情况,那它是可复制的。

使用的plv8版本是1.4.8。

0 个答案:

没有答案