【发布时间】:2012-10-03 02:35:18
【问题描述】:
我在并发环境中使用 Neo4j,我的图表如下所示:
每个项目都可以不处于或最多处于 3 种状态中的一种(S1、S2 和 S3)。一个项目可以改变它的状态,流程是这样的:项目在任何状态下都不存在,然后是S1,S2,最后是S3。
这意味着当添加一个项目时,我必须检查它是否已经存在于S1、S2 或S3 中。如果是,那么我不应该再次添加它。此外,如果项目在 S1 中并且被请求进入流中的下一个状态,则必须首先从 S1 中删除项目,然后将其添加到 S2。
对每个状态都有一个索引并不能解决这个问题,因为所有这些操作都必须以原子方式发生,因为它是一个并发环境。我检查了this link,我只能考虑采用悲观锁定 方法。基于示例添加新项目的伪代码应类似于:
search for node in all states
if node is present in any state
return node
else
begin transaction
get a write lock on #lockNode#
create node
add node to initial state
commit
return node
end
从一个状态到另一个状态的伪代码应该和之前的非常相似。
所以问题是:
- 我的伪代码中的#lockNode# 是什么?我无法从示例中弄清楚。听起来类似于
synchronized (lockNode) {},但我需要一点解释才能继续使用此解决方案 - 使用参考节点作为#lockNode#会有什么影响?
- 是否可以以原子方式和同步方式在三个索引中执行搜索,然后将节点添加/移动到某个状态?
我可以通过使用 Java 同步轻松解决此问题,但文档明确指出不应该这样做。对像我这样的 Neo4j 新手的任何帮助将不胜感激。
【问题讨论】:
标签: java multithreading graph concurrency neo4j