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