知识库

了解事务和锁超时

处理失控查询的一种方式是设置时间限制,一旦超过该限制就会终止查询。这里有一些细节需要理解,以确保行为正常并避免混淆。

定义事务超时

您可以在 neo4j.conf 文件中设置 dbms.transaction.timeout。该值必须是一个时长,后跟时间单位(ms、s、m、h;默认单位为 s)。

dbms.transaction.timeout=2m

虽然这能够充分处理并终止超过超时的正在执行的查询,但在某些情况下,查询或事务似乎会无限期挂起,超时似乎未被强制执行。

调试日志可能会报告查询已被终止,但往往是在经过很长时间之后才出现。

WARN  [o.n.k.g.TimeoutGuard] Transaction timeout. (Overtime: 523299 ms)

必须为锁获取设置单独的超时

导致此类行为的主要原因是事务可能卡在等待锁上。处于这种状态的事务正在等待另一个事务释放锁,而不是在执行代码。这包括检查事务是否已被标记为终止(因为超出了事务超时)的代码。

在 Neo4j 3.2 中,引入了一个新的配置选项

dbms.lock.acquisition.timeout.

该选项会在获取锁时超时,从而终止超过超时的事务。

强烈建议在设置事务超时时,同时也设置锁获取超时。

APOC 可用于执行限时查询

使用 APOC Procedures 中的 apoc.cypher.runTimeboxed(),可以执行动态只读 Cypher 查询,当达到指定的毫秒限制时,查询会自动终止。

CALL apoc.cypher.runTimeboxed("MATCH (n:Person{name:'Keanu Reeves'})-[*]-(other)
 RETURN count(*) as allPathsCount",
 {}, 20000)
© . This site is unofficial and not affiliated with Neo4j, Inc.