2013-08-02 67 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個其他關係。這就是爲什麼我收到我所做的信息。這裏的解決方案是重試死鎖刪除,或者明確地在兩個節點周圍加鎖。