Neo4j“不能等待资源”锁定错误

时间:2016-08-26 14:05:50

标签: node.js database neo4j graphenedb

我使用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进行数据库访问,只需查找记录,如果存在则进行更新,如果不存在则进行更新。

有何建议可以调查?

2 个答案:

答案 0 :(得分:8)

您似乎正在同时执行多个大型交易,同时触及图表的同一区域。

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

所以你可以:

  1. 序列化操作:不要并行写入,而是确保在给定时间只处理一个胖事务
  2. 缩小交易次数:如果您在单次交易中做得较少,则持续时间会缩短,其他等待锁定的交易也会超时。

答案 1 :(得分:0)

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

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

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