是否可以使用 Java API 确定“节点”是否在 Neo4J 的事务中?
Is it possible to determine if a `Node` is in a transaction in Neo4J using the Java API?
是否可以确定 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
}
}
我想这样做的原因是因为我想在尝试使用我的 class Neo4JHelper
交易之外时给我的用户一个自定义错误。
另一种解决方案是,如果有可能以某种方式告诉编译器您需要一个事务来使用 method/class,否则会给出编译错误。
我对此有几种不同的看法,我不确定哪一种最有帮助。
第 1 点是您不需要进行此检查。如果您尝试创建任何虚拟节点,而您不在事务中,数据库将抛出一个异常,表明您不在事务中。因此,如果您想检测这种情况,只需尝试创建一个简单的测试节点即可。没有例外?您正在交易中。
第 2 点可能是您在询问 特定 节点是否在交易中。我不知道有什么方法可以做到这一点,也许开发人员可以添加一些东西。在事务中,可以在单个节点上获取 read/write 锁。因此,如果您有 Transaction
对象(您的方法没有),那么代理方法可能是确定给定节点上是否有锁。
第 3 点虽然我不是 100% 确定你在做什么,但你的代码表明有不同的方法来解决这个问题,所以你甚至不必回答这个问题。如果您希望您的用户收到自定义错误,请继续并尝试修改 属性——如果 neo4j 抛出您不在事务中的异常,那么,这就是您的答案。捕获该异常,然后抛出您的自定义错误。
节点不能在事务中,只有当前执行(Thread)可以。
有一种检查 运行 交易的内部方法:
ThreadToStatementContextBridge txManager = ((GraphDatabaseAPI) graphDB).getDependencyResolver().resolveDependency(ThreadToStatementContextBridge.class);
txManager.hasTransaction();
是否可以确定 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
}
}
我想这样做的原因是因为我想在尝试使用我的 class Neo4JHelper
交易之外时给我的用户一个自定义错误。
另一种解决方案是,如果有可能以某种方式告诉编译器您需要一个事务来使用 method/class,否则会给出编译错误。
我对此有几种不同的看法,我不确定哪一种最有帮助。
第 1 点是您不需要进行此检查。如果您尝试创建任何虚拟节点,而您不在事务中,数据库将抛出一个异常,表明您不在事务中。因此,如果您想检测这种情况,只需尝试创建一个简单的测试节点即可。没有例外?您正在交易中。
第 2 点可能是您在询问 特定 节点是否在交易中。我不知道有什么方法可以做到这一点,也许开发人员可以添加一些东西。在事务中,可以在单个节点上获取 read/write 锁。因此,如果您有 Transaction
对象(您的方法没有),那么代理方法可能是确定给定节点上是否有锁。
第 3 点虽然我不是 100% 确定你在做什么,但你的代码表明有不同的方法来解决这个问题,所以你甚至不必回答这个问题。如果您希望您的用户收到自定义错误,请继续并尝试修改 属性——如果 neo4j 抛出您不在事务中的异常,那么,这就是您的答案。捕获该异常,然后抛出您的自定义错误。
节点不能在事务中,只有当前执行(Thread)可以。
有一种检查 运行 交易的内部方法:
ThreadToStatementContextBridge txManager = ((GraphDatabaseAPI) graphDB).getDependencyResolver().resolveDependency(ThreadToStatementContextBridge.class);
txManager.hasTransaction();