Sql Postgres 9.6上的plv8:以前的插入结果以后不可用

Sql Postgres 9.6上的plv8:以前的插入结果以后不可用,sql,postgresql,postgresql-9.6,plv8,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

我们在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/Cux>块中,这只是为了演示原理),而是考虑有几十个函数,函数A调用函数B等等。 在某一点上,在函数Z中,我想检索我在函数a中插入的一条记录(ID通过参数传递),但它不在那里。

UPDATE
有时也会发生同样的情况:我在函数A中运行更新,在函数Z中我希望获取新内容-但是,内容是旧内容-就好像函数A中的
UPDATE
语句从未执行过一样

如果我将整个过程分解为单独的语句,那么一切都会正常工作:如果函数B不是从函数A中调用的,而是像这样调用的

SELECT function_A();
SELECT function_B();
然后一切都会好起来,但这种方法在我的情况下是不可行的

然而,我不能孤立这种现象。它有时只发生在某些地方。如果真的发生了,在那一点上是可以复制的


所使用的plv8版本是1.4.8。

是否所有功能都在同一事务中运行?@Laurenz Albe是的,它们在同一事务中运行。这就是问题所在。我从未遇到过这样的情况。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。