在实时、事务性、多用户 neo4J 嵌入式系统上遇到死锁问题。您能否指出我的文档,该文档将说明为每个图形操作获取哪些锁 - 我特别关心添加和删除关系,因为这似乎会导致大多数死锁。
例如 添加关系:在两端节点上放置写锁(写锁是否也放置在两端节点存在的所有关系上?)
删除关系:在关系和两端节点上放置写锁(写锁是否也放置在两端节点的所有关系上?)。
为什么在删除关系时需要锁定端节点?
谢谢
在实时、事务性、多用户 neo4J 嵌入式系统上遇到死锁问题。您能否指出我的文档,该文档将说明为每个图形操作获取哪些锁 - 我特别关心添加和删除关系,因为这似乎会导致大多数死锁。
例如 添加关系:在两端节点上放置写锁(写锁是否也放置在两端节点存在的所有关系上?)
删除关系:在关系和两端节点上放置写锁(写锁是否也放置在两端节点的所有关系上?)。
为什么在删除关系时需要锁定端节点?
谢谢
添加关系时,图表会锁定所涉及的节点。如果您以不可预知的方式锁定项目,您可能会遇到死锁。对我来说,我创建了一个一对多的关系,所以我们可以通过节点 ID 对许多节点进行排序,这为我们防止了死锁。
当你删除时,它会更复杂。它锁定所涉及的节点,但在幕后将所有关系存储为双向链表,因此当您删除关系时,您必须锁定上一个和下一个链接,这样您就可以毫无问题地将它们链接在一起。这是您无法预测的事情,因为您实际上没有任何能力获得这些 ID。
您最好的选择是执行死锁重试策略。做一个try{}catch(DeadlockDetectedException){}
,如果你发现死锁异常,重试(我通过将整个操作放在一个while循环中,直到我想要的操作没有死锁才会中断)。
添加和删除关系还需要将两个节点引用更新为它们所具有的关系。换句话说,添加和删除关系意味着写入两端的节点。因此,Neo4j 需要为所有三个实体获取写锁。
不幸的是,文档似乎已经过时了。在 Neo4j 中锁定的内容比该页面显示的要多,尤其是现在它支持诸如唯一约束之类的东西。
Nicholas 关于尝试按实体的 id 排序的建议,你想写信,值得一试。您还可以尝试在图表中拆分事物,以使原本会发生冲突的事务不太可能处理相同的数据。
发现这个http://docs.neo4j.org/chunked/stable/transactions-locking.html涵盖了一些基本信息,但没有提到关系的链接列表