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

标签 java neo4j cypher

我正在构建一个独立的 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/

相关文章:

java解析html中的文本而不包含链接

java - com.mysql.jdbc.MysqlDataTruncation : Data truncation: Incorrect date value

java - 如何使用 RxJava 和 Android 订阅任务的执行

neo4j - Cypher 查询中的多个 MATCH 子句和逗号之间有什么区别?

csv - neo4j 全新安装无法识别 'using',导入时为 'load'

java - 获取身份主键的最新插入值

Neo4j 3.2 Cypher 性能低下

java - 使用带有属性映射的 Cypher CREATE 命令,来自 Java

neo4j - 为什么这个 Cypher 查询更快?

Neo4j Cypher 递归查询