我正在构建一个独立的 java 应用程序,并在嵌入式模式下使用 neo4j 和 Cypher 来存储信息。我已经构建了这个函数,用于一般用途:
private ExecutionResult runCypher(String query)
{
Transaction tx = service.beginTx();
ExecutionResult result = null;
boolean success = true;
try
{
result = engine.execute(query);
}
catch(Exception e)
{
System.out.println(e.getMessage());
success = false;
}
finally
{
if(success) tx.success();
else tx.failure();
}
tx.close();
return result;
}
问题是我经常收到这个错误:
Exception in thread "main" org.neo4j.graphdb.TransactionFailureException: Failed to mark transaction as rollback only.
at org.neo4j.kernel.TopLevelTransaction.markAsRollbackOnly(TopLevelTransaction.java:97)
at org.neo4j.kernel.TopLevelTransaction.failure(TopLevelTransaction.java:86)
如果我修改 finally 子句,并始终执行 tx.failure(),则没有问题。怎么回事?
最佳答案
我会将代码更改为:
private ExecutionResult runCypher(String query, Map params) {
try (Transaction tx = service.beginTx()) {
ExecutionResult result = engine.execute(query, params);
// extract the data out of the result, you cannot iterate over it outside of a tx
Collection resultData = ....
tx.success();
return resultData;
}
}
- 您必须在事务中迭代并从 ExecutionResult 中提取数据
- 事务支持 try-with 模式
- 你仍然需要调用
tx.success()
tx.failure()
如果您还没有调用tx.success()
将被自动假设
- 并始终使用参数。
关于java - neo4j 2.0 无法将事务标记为仅回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21135206/