使用Neo4j非托管服务器扩展执行Cypher查询时,出现了此异常“ org.neo4j.graphdb.TransactionTerminatedException”

时间:2018-07-11 18:29:49

标签: neo4j

我已在下面添加了完整的跟踪记录:

  

org.neo4j.graphdb.TransactionTerminatedException:事务具有   已终止。在新交易中重试操作,然后   应该会看到成功的结果。交易已看到有   在事务处于活动状态时被应用的更新使之无效。   如果重试,交易可能会成功。在   org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.assertInUnterminatedTransaction(ThreadToStatementContextBridge.java:77)   〜[neo4j-kernel-3.1.0.jar:3.1.0,16a782b42d76ca37db72958eb2565cf6aa671a29]   在   org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.getTopLevelTransactionBoundToThisThread(ThreadToStatementContextBridge.java:106)   〜[neo4j-kernel-3.1.0.jar:3.1.0,16a782b42d76ca37db72958eb2565cf6aa671a29]   在   org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.getKernelTransactionBoundToThisThread(ThreadToStatementContextBridge.java:114)   〜[neo4j-kernel-3.1.0.jar:3.1.0,16a782b42d76ca37db72958eb2565cf6aa671a29]   在   org.neo4j.kernel.impl.core.ThreadToStatementContextBridge.get(ThreadToStatementContextBridge.java:65)   〜[neo4j-kernel-3.1.0.jar:3.1.0,16a782b42d76ca37db72958eb2565cf6aa671a29]   在   org.neo4j.kernel.impl.core.NodeManager $ NodeActionsImpl.statement(NodeManager.java:82)   〜[neo4j-kernel-3.1.0.jar:3.1.0,16a782b42d76ca37db72958eb2565cf6aa671a29]   在   org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:454)   〜[neo4j-kernel-3.1.0.jar:3.1.0,16a782b42d76ca37db72958eb2565cf6aa671a29]   在   com.hs.haystack.graph.service.helper.mapper.ExtractNodeData.getContextCard(ExtractNodeData.java:128)   〜[server.graph-1.1.2.0.jar:?]

1 个答案:

答案 0 :(得分:0)

Cypher事务使用READ_COMMIT isolation level执行。事务(T1)可以将一些数据(D)从DB中读取到内存中,然后基于D进行一些处理。但是,其他一些事务(T2)可能已经对同一数据(在DB中)进行了更改。 em> 之后,T1将D读入内存,但在T1尝试提交自己的更改之前。如果neo4j在提交时检测到T1所做的处理是基于陈旧数据的,它将抛出TransactionTerminatedException,并显示错误消息。

现在,由于该异常是由T1和T2之间的争用条件引起的(并且两者都已完成),因此重试Cypher查询的可能性很大。

为避免这种情况,您可能希望阻止并发neo4j事务(可以接触相同的数据)或write lock查询所读取的数据。