我已在下面添加了完整的跟踪记录:
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:?]
答案 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查询所读取的数据。