0

我们在 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 等等。

在某个时刻,在函数 ZI 中,我想检索我在函数 A 中插入的记录(通过参数传递的 ID)——但它不存在。有时也会发生同样的情况UPDATE:我在函数 A 和函数 Z 中运行更新我想获取新内容 - 但是,内容是旧内容 - 就好像UPDATE函数 A 中的语句从未执行过一样。

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

SELECT function_A();
SELECT function_B();

那么一切总是好的,但在我的情况下这种方法是不可行的。

但是,我不能孤立这种现象。它有时只发生在某些地方。如果发生这种情况,那是可以重现的。

使用的 plv8 版本是 1.4.8。

4

0 回答 0