知识库

了解事务和锁超时

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

定义事务超时

您可以在 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)