6

我正在使用 Node.js 连接到托管的 GrapheneDB Neo4j 数据库,当尝试添加大约 1,500 条记录时,我收到以下错误:

LockClient[19] can't wait on resource 
RWLock[NODE(248), hash=1917331445] since => LockClient[19] 
<-[:HELD_BY]- RWLock[INDEX_ENTRY(153122458561043471), hash=1171319680] 
<-[:WAITING_FOR]- LockClient[15] <-[:HELD_BY]- RWLock[NODE(248), hash=1917331445]

生成这个的代码来自一个获取 JSON 对象列表然后将它们存储在 Neo4j 中的路由。导入大约 1,500 条记录时,我一直收到此错误。

使用 seraph-model 进行数据库访问并仅查找记录,如果存在则更新,如果不存在则创建它。

有什么建议去哪里调查?

4

2 回答 2

9

看起来您正在同时执行多个大型事务,同时触及图表的同一区域。

当 Neo4j 执行写入时,会在该节点/关系上获取写入锁,并在事务关闭时释放。其他同时运行的事务试图在已经锁定的实体上获取写锁需要等待 - 否则就会打开一个潘多拉不一致的盒子。如果锁的所有者是一个运行时间相当长的事务,那么另一个可能会遇到超时——这就是上面的错误消息。

所以你可以:

  1. 序列化操作:不要并行写入,而是确保在给定时间只处理一个胖事务
  2. 使事务更小:如果你在单个事务中做的更少,持续时间会更短,其他等待锁的事务不会超时。
于 2016-08-29T10:23:58.337 回答
0

我也一直在经历这种情况。我读过的建议解决方法是:

  • 串行化并行写作(但你失去了并行性的好处)
  • 使用某种顺序列出写入查询中的节点,例如,对 ID 进行排序(但它会将排序开销添加到写入线程)

我决定采用第三种选择:重新尝试 Cypher 操作,直到它顺利进行,或者达到最大值。次,在尝试之间暂停一段时间。我的这个实用程序可以提供帮助。对于 Neo4 驱动程序,org.neo4j.driver.v1.exceptions.TransientException是您要传递给构造函数的异常。

于 2017-12-22T15:11:08.270 回答