2017-03-31 297 views
0

我有兩個節點叫做成員和內容,兩者在關係爲HAS_RECOMMENDED(成員 - [:HAS_RECOMMENDED] - >內容)的n:n路中相關。一個成員可以有多個推薦內容,一個內容可以由多個成員推薦。neo4j在多線程更新關係時發生死鎖問題

當我使用多線程創建從Java的圖形和關係,我得到以下錯誤:

org.springframework.dao.ConcurrencyFailureException: Error executing Cypher "Neo.TransientError.Transaction.DeadlockDetected"; Code: Neo.TransientError.Transaction.DeadlockDetected; Description: LockClient[1604184] can't wait on resource RWLock[NODE(63575), hash=2083848996] since => LockClient[1604184] <-[:HELD_BY]- RWLock[NODE(63663), hash=1735956338] <-[:WAITING_FOR]- LockClient[1604182] <-[:HELD_BY]- RWLock[NODE(63575), hash=2083848996]; nested exception is org.neo4j.ogm.exception.CypherException: Error executing Cypher "Neo.TransientError.Transaction.DeadlockDetected"; Code: Neo.TransientError.Transaction.DeadlockDetected; Description: LockClient[1604184] can't wait on resource RWLock[NODE(63575), hash=2083848996] since => LockClient[1604184] <-[:HELD_BY]- RWLock[NODE(63663), hash=1735956338] <-[:WAITING_FOR]- LockClient[1604182] <-[:HELD_BY]- RWLock[NODE(63575), hash=2083848996]

回答

2

當創建一個關係,它的端點節點是寫鎖定。如果多個線程嘗試創建涉及同一組端點節點的關係,則可能會發生死鎖,就像您正在經歷的那樣。

如果你可以讓每個線程在它自己的一組端點節點上工作(不被任何其他線程共享),那麼你應該能夠避免這種類型的死鎖。