py2neo和最终的一致性?

问题描述 投票:0回答:1

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

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

当Flask请求更新Neo4j数据库时

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向Neo4j服务器发送了正确的请求,并且Py2Neo正在从Neo4j服务器接收更新的数据。但Py2Neo Cursor.data()显示旧数据返回给应用程序,尽管服务器给出Py2Neo新数据。

flask neo4j py2neo
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.