为了记录,我使用的是Neo4j 2.0.0-M02。
我目前有一种方法可以在用户ID上搜索标签为“User”的节点,该用户ID作为节点属性“id”存储在图表中。这一切都发生在事务中,因为它会自动关闭ResourceIterator。
现在,我想在两个用户之间建立关系。我只拥有他们的用户ID。现在,我显然希望重用按其ID搜索用户的方法。我有三种方法可以想到。
第一个是显而易见的。使用现有方法检索两个节点。比调用创建它们之间关系的方法。显然这也发生在一个事务中,所以这需要三个事务。效率不高。
第二个是在创建关系的新方法中重用代码(而不是方法)。这样,我可以在一个事务中完成所有操作,但我复制的代码对开发人员来说并不是一个很好的实践。
第三个是在创建关系的新方法的事务内调用现有方法两次。这样我的代码仍然可以重用,但我不确定嵌套事务在Neo4J中是如何工作的。是否会忽略现有方法的交易,因为已有现有交易?这将解决我的问题。
如果没有,我必须重新考虑我管理交易的地方。我知道在服务中管理它们通常比DAO更好,但是我想把Neo4j的东西从我的服务类中删除。
答案 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()可以使用或不使用现有事务。如果事务存在,它执行的操作将在其中发生,但如果没有现有事务,则将创建一个事务。所以两者都有效。