为每个图形操作获取了哪些锁定

时间:2013-08-29 21:09:25

标签: neo4j

在实时,事务性,多用户neo4J嵌入式系统上遇到死锁问题。你能否指出一些文档,它将说明为每个图形操作获取的锁定 - 我特别关注添加和删除关系,因为这似乎会导致大多数死锁。

e.g。 添加关系:写入两个端节点上的锁定(写锁定是否也存在于两个端节点的所有关系上?)

删除关系:写入关系和两个终端节点上的锁定(对于两个终端节点的所有关系,是否也写入了锁定?)。
为什么在关系删除期间需要锁定端节点?

由于

3 个答案:

答案 0 :(得分:2)

添加关系时,图表会锁定所涉及的节点。如果以不可预测的方式锁定项目,则可能会出现死锁。对我来说,我创建了一对多关系,因此我们可以按节点ID排序许多节点,这可以防止我们陷入僵局。

当你删除时,它会更复杂。它锁定所涉及的节点,但是在封面下将所有关系存储为双向链接列表,因此当您删除关系时,您必须锁定上一个和下一个链接,以便可以将它们链接在一起而不会出现问题。这是你无法预测的,因为你没有任何能力获得这些ID。

最好的办法是做一个死锁重试政策。做一个try{}catch(DeadlockDetectedException){},如果你遇到死锁异常,重试(我做了这个,把整个操作放在一个不会中断的while循环中,直到我想要的操作没有死锁)。

答案 1 :(得分:1)

添加和删除关系还需要更新两个节点对它们具有的关系的引用。换句话说,添加和删除关系意味着写入两端的节点。因此,Neo4j需要对所有三个实体进行写锁定。

遗憾的是,文档已经过时了。锁定Neo4j的内容远远超过该页面显示的内容,特别是现在它支持独特限制之类的内容。

Nicholas关于尝试通过他们的ID来命令实体的建议是值得尝试的。您还可以尝试在图表中拆分,这样否则会发生冲突的事务不太可能对相同的数据起作用。

答案 2 :(得分:0)

找到此http://docs.neo4j.org/chunked/stable/transactions-locking.html,其中包含一些基本信息,但没有提及关系列表