是否可以使用Java API确定“Node”是否在Neo4J中的事务中?

问题描述:

是否可以确定Node是否在交易中?通过方法Node.getGraphDatabase可以获得GraphDatabaseService是否可以使用Java API确定“Node”是否在Neo4J中的事务中?

我愿做这样的事情:

public class Neo4JHelper { 
    public void setProperty(Node node, String key, Object value) { 
     if(isInTransaction(node) { 
      node.setProperty(key, value); 
     } else { 
      throw new MyOwnException("You are trying to set a node outside a transaction... you suck"); 
     } 
    } 

    private boolean isInTransaction(Node node) { 
     //Something 
    } 
} 

我想这样做的原因是因为我想尝试使用我的Neo4JHelper类交易之外的时候给我的用户自定义错误。

另一种解决方案是,如果有可能以某种方式告诉编译器,您需要事务来使用方法/类,否则会产生编译错误。

+0

为什么要这么做? – MicTech

+0

@MicTech:因为我很奇怪。 (我更新了我的问题来解释)。 –

节点不能在事务中,只有当前执行(Thread)可以。

有一个内部的方式来检查运行的事务:

ThreadToStatementContextBridge txManager = ((GraphDatabaseAPI) graphDB).getDependencyResolver().resolveDependency(ThreadToStatementContextBridge.class); 
    txManager.hasTransaction(); 

我对此有几个不同的看法,我不确定哪一个最有帮助。

点#1是你不需要做这个检查。如果您尝试创建任何虚拟节点,并且您不在事务内部,则数据库将引发异常,指示您不在事务中。所以如果你想检测这种情况,试着创建一个简单的测试节点。没有例外?您正在进行交易。

点#2也许你问是否有一个特定的节点处于事务中。我不知道有什么办法可以做到这一点,也许开发人员可以添加一些东西。在事务中,可以在单个节点上获取读/写锁。因此,如果您有Transaction对象(您的方法没有),则代理方法可能是确定给定节点上是否存在锁定。

点#3,虽然我不是100%确定你在做什么,但你的代码表明有一种解决这个问题的不同方式,所以你甚至不需要回答这个问题。如果你希望你的用户得到一个自定义的错误,那就试着修改这个属性 - 如果neo4j抛出一个你不在事务中的异常,那么你的答案就是这样。捕获该异常,然后抛出自定义错误。

+0

我想到了_Point#3_替代方案,但是如果我能够在尝试做某件事之前检查自己是否在交易中,我仍然会更喜欢。作为一个例子,如果我认为某个变量在我的代码中可能是'null',那么我不会在它的周围放一个try-catch并且捕获一个'NullPointerException',我会在尝试使用它之前检查它是否为null。但如果它是唯一的方式,我想这就是我将如何做到这一点。我没有看到_Point#1_和_Point#3_之间的区别,我仍然需要捕获第一个节点上的异常? _Point#2_不是我的用例。谢谢您的回答! –

+0

点#3与#1类似,关键的建议是,如果您以不同的方式解决问题,那么问题实际上可能会变得没有实际意义。 – FrobberOfBits

+0

如果我想建一座桥,一艘船不是答案。不管怎样,谢谢你。 :) –