我在并发环境中使用 Neo4j,我的图表如下所示:
每个项目可以不处于或最多处于 3 种状态(S1
和S2
)S3
中的一种。一个项目可以改变它的状态,流程是这样的:项目在任何状态下都不存在,然后S1
,S2
最后S3
。
这意味着当添加一个项目时,我必须检查它是否已经存在于S1
,S2
或S3
. 如果是,那么我不应该再次添加它。此外,如果项目在S1
并且被请求进入流中的下一个状态,则必须首先从 中删除该项目S1
,然后再将其添加到S2
。
对每个状态都有一个索引并不能解决这个问题,因为所有这些操作都必须以原子方式发生,因为它是一个并发环境。我已经检查了这个链接,我只能考虑采用悲观锁定方法。基于示例添加新项目的伪代码应类似于:
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# 是什么?我无法从示例中弄清楚。听起来类似于 a
synchronized (lockNode) {}
但我需要一些解释才能继续使用此解决方案 - 将参考节点用作#lockNode# 会有什么影响?
- 是否可以以原子方式和同步方式在三个索引中执行搜索,然后将节点添加/移动到某个状态?
我可以通过使用 Java 同步轻松解决这个问题,但文档明确指出不应该这样做。对像我这样的 Neo4j 新手的任何帮助将不胜感激。