Neo4j中的嵌套事务

时间:2013-04-30 12:14:08

标签: transactions neo4j nested-transactions

为了记录,我使用的是Neo4j 2.0.0-M02。

我目前有一种方法可以在用户ID上搜索标签为“User”的节点,该用户ID作为节点属性“id”存储在图表中。这一切都发生在事务中,因为它会自动关闭ResourceIterator。

现在,我想在两个用户之间建立关系。我只拥有他们的用户ID。现在,我显然希望重用按其ID搜索用户的方法。我有三种方法可以想到。

第一个是显而易见的。使用现有方法检索两个节点。比调用创建它们之间关系的方法。显然这也发生在一个事务中,所以这需要三个事务。效率不高。

第二个是在创建关系的新方法中重用代码(而不是方法)。这样,我可以在一个事务中完成所有操作,但我复制的代码对开发人员来说并不是一个很好的实践。

第三个是在创建关系的新方法的事务内调用现有方法两次。这样我的代码仍然可以重用,但我不确定嵌套事务在Neo4J中是如何工作的。是否会忽略现有方法的交易,因为已有现有交易?这将解决我的问题。

如果没有,我必须重新考虑我管理交易的地方。我知道在服务中管理它们通常比DAO更好,但是我想把Neo4j的东西从我的服务类中删除。

1 个答案:

答案 0 :(得分:5)

第三个选项是它如何工作,因为neo4j中没有真正的嵌套事务,而是存在外部事务的非常浅的事务,所以实际上没有开销。

Transaction tx = db.beginTx();
try
{
    otherMethod( db );
    tx.success();
}
finally
{
    tx.finish();
}

private void otherMethod( GraphDatabaseService db )
{
    Transaction tx = db.beginTx();
    try
    {
        // do some other stuff...
        tx.success();
    }
    finally
    {
        tx.finish();
    }
}

在上面的示例中,调用otherMethod()可以使用或不使用现有事务。如果事务存在,它执行的操作将在其中发生,但如果没有现有事务,则将创建一个事务。所以两者都有效。