理解事务和锁超时
处理失控查询的一种方法是设置一个时间限制,超时时将终止查询。这里有一些需要理解的细微之处,以确保正确的行为并避免混淆。
定义事务超时
您可以在 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)
此页面有帮助吗?