2014-02-26 160 views
2

我实现Neo4j的客户端BG benchmark。有11个功能,模拟11种不同的社交活动。每个函数都有自己的事务主体。但是当我使用100个线程运行时,有时会引发死锁检测异常。Neo4j的死锁

我有用户为节点和友谊的关系。我邀请朋友,拒绝朋友,接受朋友并融合所有有两个用户的朋友作为他们的投入。他们工作的方式是获取一个用户节点的所有关系,并找到与另一个用户节点的关系。

是任何人察觉锁定的Neo4j的机制呢?

回答

4

你可以阅读有关在Neo4j documentation死锁。当您对同一实体(节点或关系)进行并发修改时,可能会出现这些错误。请注意,在修改实体时,可能会使用多个锁:例如,对于关系,将采用通过关系连接的两个节点上的锁。

+0

BG基准选取两个随机用户,并调用与输入随机的行动之一。但每次选择两个用户时,它会锁定它们,所以其他线程将无法选择这些用户。通过这个我的意思是两个线程不可能选择两个相同的用户。 – user3353973

+1

这将有助于描述你在交易中做什么。僵局可能来自对关系的锁定:假设你有用户A和B,他们有两个共同的朋友C和D:A - C - B和A - D - B。同时移除A和B可能会导致死锁,因为两者都需要C和D上的锁。 – RaduK

+0

有一个用户查看好友列表操作,该操作将锁定该特定用户的所有友谊关系以对其进行计数。假设函数viewFriend(u1)将锁定所有用户u2-u10。同时u2可能想要邀请u10,它需要锁定u2和u10,但它不能!所以我认为这是因为对图的任何访问都会获得相同的锁: - ? – user3353973

1

默认锁定行为:

  1. 当添加,改变或节点或关系的写入锁将所述特定节点或关系上采取上除去的特性。
  2. 创建或删除节点时,将为特定节点执行写入锁定。
  3. 创建或删除关系时,将对特定关系及其两个节点执行写入锁定。

的锁将被添加到该交易,并在交易完成后公布。

  1. 设计数据库以最小锁定的方式存在。
  2. 避免使用同一个节点,并且关系被许多用户在同一实例中使用。保持这些节点和关系的最小交易周期。