是否可以使用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
类交易之外的时候给我的用户自定义错误。
另一种解决方案是,如果有可能以某种方式告诉编译器,您需要事务来使用方法/类,否则会产生编译错误。
节点不能在事务中,只有当前执行(Thread)可以。
有一个内部的方式来检查运行的事务:
ThreadToStatementContextBridge txManager = ((GraphDatabaseAPI) graphDB).getDependencyResolver().resolveDependency(ThreadToStatementContextBridge.class);
txManager.hasTransaction();
我对此有几个不同的看法,我不确定哪一个最有帮助。
点#1是你不需要做这个检查。如果您尝试创建任何虚拟节点,并且您不在事务内部,则数据库将引发异常,指示您不在事务中。所以如果你想检测这种情况,试着创建一个简单的测试节点。没有例外?您正在进行交易。
点#2也许你问是否有一个特定的节点处于事务中。我不知道有什么办法可以做到这一点,也许开发人员可以添加一些东西。在事务中,可以在单个节点上获取读/写锁。因此,如果您有Transaction
对象(您的方法没有),则代理方法可能是确定给定节点上是否存在锁定。
点#3,虽然我不是100%确定你在做什么,但你的代码表明有一种解决这个问题的不同方式,所以你甚至不需要回答这个问题。如果你希望你的用户得到一个自定义的错误,那就试着修改这个属性 - 如果neo4j抛出一个你不在事务中的异常,那么你的答案就是这样。捕获该异常,然后抛出自定义错误。
我想到了_Point#3_替代方案,但是如果我能够在尝试做某件事之前检查自己是否在交易中,我仍然会更喜欢。作为一个例子,如果我认为某个变量在我的代码中可能是'null',那么我不会在它的周围放一个try-catch并且捕获一个'NullPointerException',我会在尝试使用它之前检查它是否为null。但如果它是唯一的方式,我想这就是我将如何做到这一点。我没有看到_Point#1_和_Point#3_之间的区别,我仍然需要捕获第一个节点上的异常? _Point#2_不是我的用例。谢谢您的回答! –
点#3与#1类似,关键的建议是,如果您以不同的方式解决问题,那么问题实际上可能会变得没有实际意义。 – FrobberOfBits
如果我想建一座桥,一艘船不是答案。不管怎样,谢谢你。 :) –
为什么要这么做? – MicTech
@MicTech:因为我很奇怪。 (我更新了我的问题来解释)。 –