2013-08-02 144 views
0

我正在使用嵌入式neo4j作为Web服务。我的模型的一部分是像这样:删除关系时避免死锁

(user)-[HAS_ITEM]->(item) 

现在我有几个删除进来一次针对不同users,但对于一些相同items的。我知道如果我做这些更新,我会得到死锁,因为Neo4j会在我尝试删除时锁定节点。我见过的推荐策略是订购这些更新,所以我做了,我需要删除并排列item节点的列表,因此我总是以某种可预测的顺序删除。但是,当我删除关系时,即使他们是不同的关系,我也会遇到与关系锁定有关的另一个问题。这是错误:

Details: 'Transaction(43141)[STATUS_ACTIVE,Resources=1] can't wait on resource RWLock[Relationship[620613598]] since => Transaction(43141)[STATUS_ACTIVE,Resources=1] <-[:HELD_BY]- RWLock[Node[620]] <-[:WAITING_FOR]- Transaction(43142)[STATUS_ACTIVE,Resources=0] <-[:HELD_BY]- RWLock[Relationship[620613598]]'. 

Details: 'Transaction(43746)[STATUS_ACTIVE,Resources=0] can't wait on resource RWLock[Node[620]] since => Transaction(43746)[STATUS_ACTIVE,Resources=0] <-[:HELD_BY]- RWLock[Lockable relationship #620634878] <-[:WAITING_FOR]- Transaction(43747)[STATUS_ACTIVE,Resources=1] <-[:HELD_BY]- RWLock[Node[620]]'. 

我该如何解决这个问题?我相信节点是这里唯一的争论点,然而似乎对交易正在争取的关系有一个锁定,尽管每个交易都不应该处理这些关系的删除(删除是互斥的到user)。

+0

您可以尝试获取写入锁,在删除关系之前,在用户和项目节点上调用* acquireWriteLock *方法。 – remigio

+0

是的。但对于我的更新,每笔交易都是为1个'user',所以我知道这不是争用。我知道'items'可以是相同的,但是我以可预测的模式访问它们,所以即使我锁定它,它也不应该是该节点上的死锁。 – Nicholas

回答

0

Neo4j锁定关系以及存储在磁盘上的链接列表中附加的4个其他关系。这就是为什么我收到我所做的信息。这里的解决方案是重试死锁删除,或者明确地在两个节点周围加锁。