多线程更新关系时neo4j中的死锁问题
Deadlock issue in neo4j while updating the relationship by multiple thread
我有两个名为 Member 和 Content 的节点,它们都以 n:n 方式与关系 HAS_RECOMMENDED
相关(Member -[:HAS_RECOMMENDED] -> Content)。一个会员可以有多个推荐内容,一个内容可以被多个会员推荐。
当我使用多线程从 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]
创建关系时,其端点节点是写锁定的。如果多个线程试图创建涉及同一组端点节点的关系,则可能会发生死锁,正如您遇到的那样。
如果您可以让每个线程在其自己的一组端点节点上工作(不被任何其他线程共享),那么您应该能够避免此类死锁。
我有两个名为 Member 和 Content 的节点,它们都以 n:n 方式与关系 HAS_RECOMMENDED
相关(Member -[:HAS_RECOMMENDED] -> Content)。一个会员可以有多个推荐内容,一个内容可以被多个会员推荐。
当我使用多线程从 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]
创建关系时,其端点节点是写锁定的。如果多个线程试图创建涉及同一组端点节点的关系,则可能会发生死锁,正如您遇到的那样。
如果您可以让每个线程在其自己的一组端点节点上工作(不被任何其他线程共享),那么您应该能够避免此类死锁。