Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于在同一事务中锁定的节点之间创建关系的Neo4j死锁_Java_Transactions_Neo4j_Deadlock - Fatal编程技术网

Java 用于在同一事务中锁定的节点之间创建关系的Neo4j死锁

Java 用于在同一事务中锁定的节点之间创建关系的Neo4j死锁,java,transactions,neo4j,deadlock,Java,Transactions,Neo4j,Deadlock,我的Neo4j服务器在执行并发请求时抛出死锁检测异常,我不知道为什么 以下代码由客户端REST请求调用的服务器插件调用,并发生在单个事务中 Node nFollowing = loadUser(idFollowing); Node nFollowed = loadUser(idFollowed); // locking order to avoid deadlocks if (Long.valueOf(idFollowing) < Long.valueOf(idFollo

我的Neo4j服务器在执行并发请求时抛出死锁检测异常,我不知道为什么

以下代码由客户端REST请求调用的服务器插件调用,并发生在单个事务中

  Node nFollowing = loadUser(idFollowing);
  Node nFollowed = loadUser(idFollowed);

  // locking order to avoid deadlocks
  if (Long.valueOf(idFollowing) < Long.valueOf(idFollowed)) {
    tx.acquireWriteLock(nFollowing);
    tx.acquireWriteLock(nFollowed);
  } else {
    tx.acquireWriteLock(nFollowed);
    tx.acquireWriteLock(nFollowing);
  }

  // create relationship if not present
  for (Relationship followship : nFollowing.getRelationships(
    EdgeType.FOLLOWS, Direction.OUTGOING)) {
    if (followship.getEndNode().equals(nFollowed)) {
      return;
    }
  }
  nFollowing.createRelationshipTo(nFollowed, EdgeType.FOLLOWS);
我不明白为什么:我已经为
nfoollowing
nfoollowing
设置了锁。实际上,死锁的目标不是节点锁,而是关系锁。由于关系仅在不存在时创建,因此锁持有者必须是当前的

如果是这样的话,锁座正在等待自己。 我怎样才能避免这种情况,或者例外情况还想说什么

以防万一:
我不想使用Neo4j也使用的
同步
块,因为它会大大降低我的服务速度,我不希望这些并发请求经常发生。

死锁是由
snychronized
块和手动事务锁造成的。我没有从以前执行的测试中删除
synchronized
语句。 虽然
synchronized
语句没有针对锁定的节点,但引发了异常。这两种锁定机制似乎不兼容

这导致了一个奇怪的错误消息,它对我没有多大帮助

"ForsetiClient[78] can't acquire ExclusiveLock{owner=ForsetiClient[73]} on  
  RELATIONSHIP(49), because holders of that lock are waiting for ForsetiClient[78].\n
  Wait list:ExclusiveLock[ForsetiClient[73] waits for [73, 78, ]]",
"exception" : "DeadlockDetectedException",
"fullname" : "org.neo4j.kernel.DeadlockDetectedException",
"stacktrace" : [
  "org.neo4j.kernel.ha.lock.forseti.ForsetiClient.markAsWaitingFor(ForsetiClient.java:611)",
  "org.neo4j.kernel.ha.lock.forseti.ForsetiClient.acquireExclusive(ForsetiClient.java:190)",
  "org.neo4j.kernel.impl.nioneo.xa.TransactionalRelationshipLocker.getWriteLock(TransactionalRelationshipLocker.java:33)",
  "org.neo4j.kernel.impl.core.NodeProxy.createRelationshipTo(NodeProxy.java:455)",
  "de.uniko.sebschlicht.neo4j.graphity.WriteOptimizedGraphity.addFollowship(WriteOptimizedGraphity.java:40)",
  "de.uniko.sebschlicht.neo4j.graphity.Graphity.addFollowship(Graphity.java:115)",
  "de.uniko.sebschlicht.neo4j.GraphityBaselinePlugin.follow(GraphityBaselinePlugin.java:38)",
  "org.neo4j.server.rest.web.ExtensionService.invokeGraphDatabaseExtension(ExtensionService.java:134)",
  "org.neo4j.server.rest.transactional.TransactionalRequestDispatcher.dispatch(TransactionalRequestDispatcher.java:139)"
]