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