【问题标题】:Is it possible to determine if a `Node` is in a transaction in Neo4J using the Java API?是否可以使用 Java API 确定 Neo4J 中的“节点”是否在事务中?
【发布时间】:2015-11-06 12:32:24
【问题描述】:

是否可以确定Node 是否在事务中?可以通过Node.getGraphDatabase方法得到GraphDatabaseService

我想做这样的事情:

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
    }
}

我想这样做的原因是因为我想在尝试使用我的类Neo4JHelperoutside 事务时给我的用户一个自定义错误。

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

【问题讨论】:

  • 为什么要这样做?
  • @MicTech:因为我很奇怪。 (我更新了我的问题来解释)。

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


【解决方案1】:

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

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

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

第 3 点虽然我不能 100% 确定您在做什么,但您的代码表明解决此问题的方法不同,因此您甚至不必回答这个问题。如果您希望您的用户得到一个自定义错误,请继续尝试修改该属性——如果 neo4j 抛出一个您不在事务中的异常,那么这就是您的答案。捕获该异常,然后抛出您的自定义错误。

【讨论】:

  • 我考虑了 Point #3 替代方案,但我仍然希望在尝试做某事之前检查我是否处于事务中。例如,如果我认为变量在我的代码中的某个位置可能是 null,我不会在它周围放置 try-catch 并捕获 NullPointerException,我会在尝试使用它之前检查它是否为空。但如果这是我猜想的唯一方法,我会这样做。我没有看到 Point #1Point #3 之间的区别,我还需要在第一个节点上捕获异常吗? Point #2 不是我的用例。谢谢你的回答!
  • 第 3 点与第 1 点相似,关键建议是,如果您以不同的方式处理问题,那么问题实际上可能变得毫无意义。
  • 如果我想建一座桥,船不是答案。还是非常感谢。 :)
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多