並行環境で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#とは何ですか?例からはわかりません。に似ているように
synchronized (lockNode) {}
聞こえますが、このソリューションを続行するには少し説明が必要です - 参照ノードを#lockNode#として使用するとどのような影響がありますか?
- アトミックに同期して3つのインデックスで検索を実行し、ノードを状態に追加/移動することは可能ですか?
Java同期を使用することでこれを簡単に解決できますが、ドキュメントには、これを行うべきではないと明確に記載されています。私のようなNeo4j初心者のための助けをいただければ幸いです。