我在並行環境中使用Neo4j的,我有圖表,看起來像這樣: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) {}
,但我需要一點點exaplanation繼續這個解決方案 - 使用參考節點作爲#lockNode#的影響會是什麼?
- 是否有可能以原子方式並以同步方式在三個索引中執行搜索,然後將該節點添加/移動到某個狀態?
我可以很容易地通過使用Java同步來解決這個問題,但文檔明確指出不應該這樣做。任何像我這樣的Neo4j新手的幫助將不勝感激。