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

时间:2015-11-06 12:32:25

标签: java database neo4j graph-databases neo4j-java-api

是否可以确定Node是否在交易中?可以通过GraphDatabaseService方法获得Node.getGraphDatabase

我想做这样的事情:

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时给我的用户一个自定义错误。

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

2 个答案:

答案 0 :(得分:3)

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

第1点是你不需要做这个检查。如果您尝试创建任何虚拟节点,并且您不在事务内部,则DB将抛出异常,指示您不在事务中。因此,如果您想要检测这种情况,只需尝试创建一个简单的测试节点。没有例外?您正在进行交易。

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

第3点,虽然我不能100%确定你正在做什么,但是你的代码建议有不同的解决方法,所以你甚至不必回答这个问题。如果您希望您的用户收到自定义错误,请继续尝试修改该属性 - 如果neo4j引发了您不在交易中的异常,那么您的答案也是如此。抓住该异常,然后抛出自定义错误。

答案 1 :(得分:2)

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

有一种内部方法可以检查正在运行的事务:

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