删除关系时避免死锁

时间:2013-08-02 16:54:47

标签: neo4j deadlock

我使用嵌入式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)。

1 个答案:

答案 0 :(得分:0)

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