gpt4 book ai didi

java - Neo4j 中锁释放导致死锁

转载 作者:行者123 更新时间:2023-12-01 11:38:54 29 4
gpt4 key购买 nike

考虑一个包含用户和新闻项目的社交网络图。修改图形的方法有多种,可以同时调用。
我实现了一个锁定管理器来避免任何死锁。它锁定从最低到最高用户 ID 排序的用户,该用户 ID 作为属性存储在用户节点中。锁以相反的顺序释放。

尽管如此,在并发执行特定方法时,我收到以下 DeadLockDetectedException :

org.neo4j.kernel.TopLevelTransaction@41aaf8e9:
locking manager locked [NODE(0) [#1], NODE(5) [#3]]
org.neo4j.kernel.TopLevelTransaction@41aaf8e9:
locking manager released [NODE(5) [#3], NODE(0) [#1]]
org.neo4j.kernel.TopLevelTransaction@41aaf8e9:
locking manager locked [NODE(1) [#2]
Exception in thread "Thread-3" org.neo4j.kernel.TopLevelTransaction@6242de17:
org...DeadlockDetectedException:
LockClient[18] can't wait on resource RWLock[NODE(1)] since =>
LockClient[18] <-[:HELD_BY]- RWLock[NODE(5)] <-[:WAITING_FOR]- LockClient[20] <-[:HELD_BY]- RWLock[NODE(1)]
org.neo4j.kernel.TopLevelTransaction@7007944f:
locking manager locked [NODE(1) [#2], NODE(5) [#3]]

正如您所看到的,一个事务锁定了两个用户节点(id 1和3)。稍后,它尝试锁定另一个用户节点(id 2),但无法获取该锁:有第二个事务已锁定 id 2 的用户,并正在等待锁定 id 3 的用户。
似乎有道理,这将是一个死锁。

但是,代码和之前的日志消息讲述了另一个故事:在事务尝试锁定 id 2 的用户之前,它释放了之前获取的两个锁。相应的代码如下:

Transaction tx = graph.beginTransaction();
// locks NODE(0) and NODE(5)
Lock[] locks = LockManager.lock(tx, following, followed);
boolean result = removeFollowship(following, followed);
// releases NODE(5) and NODE(0)
LockManager.releaseLocks(locks);
...
// tries to lock NODE(1)
List<Lock> locks = LockManager.lock(tx, replicaLayer);
try {
return addStatusUpdate(author, statusUpdate);
} finally {
LockManager.releaseLocks(locks);
}
...
tx.success();

锁管理器通过tx.acquireWriteLock(node)锁定节点并通过lock.release()释放锁。
有什么我不知道的吗?例如,调用lock.release与相应节点的新锁定之间是否存在延迟?

最佳答案

锁实际上只是在事务完成时才被释放。

这就是为什么在调用 tx.close() 之前它仍然持有锁。

关于java - Neo4j 中锁释放导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29718245/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com