py2neo和最终的一致性?

时间:2018-03-02 22:27:33

标签: flask neo4j py2neo

我正在使用Flask调试服务器中的Py2Neo 3(v3.1.1)来访问Neo4j。

Neo4j服务器是Ubuntu 16.04上基本的apt-get'd Neo4j服务器(3.3.3)。 Py2Neo正在使用Bolt端口。

更新Neo4j db的Flask请求时

tx = graph.begin();
....
tx.commit();

之后是来自同一客户端的请求,在四秒或更长时间内,95%的时间,第二个查询的结果不会反映几秒前刚刚发生的更新。但是,如果另一个客户端在更新后立即通过Flask服务器查询数据库,则每次都会看到更新的数据。看起来,如果第二个客户端这样做,第一个看到旧数据的客户可能会下降到大约75%。

我很确定Neo4j没有以Causal一致模式运行。 (当我安装Neo4j时,我做了一个简单的apt-get安装。)我该如何确认?

我相信Flask服务器正在为所有请求使用相同的Py2Neo图形对象。

如上所述,Py2Neo更新请求确实使用显式事务,后跟显式tx.commit()。但是该图形对象已经用于一些自动提交查询以及显式事务之外。

我没有在Py2Neo 3文档中看到任何“因果关系”或“最终”或“缓存”的提及。

你有什么建议?

---更新1 -----

这似乎不是Neo4j服务器问题。打开Py2Neo.watch('neo4j.bolt')显示Py2Neo发送正确的请求 Py2Neo正在接收Neo4j服务器和更新的数据 Neo4j服务器。但Py2Neo Cursor.data()显示旧数据返回给应用程序,尽管服务器给出Py2Neo新数据。

1 个答案:

答案 0 :(得分:0)

实际上可以在这里找到部分答案:Is py2neo caching burning me?

引用的页面表明您可能会受益于对my_node.pull()的调用。这应该可行,但我认为你会发现它实际上是低效的,因为它会导致对数据库的另一个非平凡的请求,尽管已经从数据库中有效地接收了一个(或更多)次的正确值然后被忽略。

作为替代方案,请考虑使用Neo Technologies发布的支持并且Py2Neo正在使用的Python驱动程序。如果你这样做,你将失去Py2Neo的一些功能(例如OGM),但你可以更好地控制你的应用程序和Neo4j服务器之间的对话,以及你的堆栈中少一个,可能是错误的层。您可以找到有关此Python驱动程序和其他选项here的信息。

相关问题