知识库

理解事务和锁超时

处理失控查询的一种方法是设置一个时间限制,超时时将终止查询。这里有一些需要理解的细微之处,以确保正确的行为并避免混淆。

定义事务超时

您可以在 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 过程中的 apoc.cypher.runTimeboxed(),您可以执行一个动态的只读 Cypher 查询,当达到给定的毫秒限制时,该查询将自动终止。

CALL apoc.cypher.runTimeboxed("MATCH (n:Person{name:'Keanu Reeves'})-[*]-(other)
 RETURN count(*) as allPathsCount",
 {}, 20000)
© . All rights reserved.