gpt4 book ai didi

java - neo4j 2.0 无法将事务标记为仅回滚

转载 作者:行者123 更新时间:2023-11-29 07:51:06 25 4
gpt4 key购买 nike

我正在构建一个独立的 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;
}
}
  1. 您必须在事务中迭代并从 ExecutionResult 中提取数据
  2. 事务支持 try-with 模式
  3. 你仍然需要调用tx.success()
  4. tx.failure() 如果您还没有调用 tx.success()
  5. 将被自动假设
  6. 并始终使用参数。

关于java - neo4j 2.0 无法将事务标记为仅回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21135206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com