2012-12-23 177 views
3

我剛剛開始與neo4j評估它是否會成爲推薦引擎的良好底層數據庫。我想知道在讀寫操作期間是否有關於實體獲得的鎖的文檔。neo4j鎖定交易

E.g.如果節點N分別通過關係R1和R2與節點N1和N2相關,如果正在創建或修改關係R1,那麼使用N,N1,N2或R2(可能是關係創建/修改或遍歷)的任何操作遇到塊?直覺上,我猜測不是,因爲它只有R1被寫入,並且這是唯一應該被鎖定的實體。不過,我想這也取決於底層的實現,特別是因爲爲每一個關係都提供了雙向遍歷(也許N和N1會被鎖定?)。如果有人能夠指出我的一些官方文檔,這將是非常棒的。

如果確實發生了這種鎖定,我可以想到解決問題的一種方法是將每個節點解析爲每個關係目的的子節點,每個節點都連接到根實體。 (說用戶社交用戶,用戶產品用戶等)

我想這將允許更小數目每個節點的關係,根節點的分辨率爲重寫入和讀取重的孩子,並允許快速檢索某些子圖。我可以看到的唯一缺點是節點和關係的總數增加n次(我的db大小相對較小,n = 4,所以我沒有這個問題)。任何關於這些結論是否正確的意見,如果有的話,如果它們有助於提高性能並減少鎖的數量,將不勝感激。

+1

我不太確定起始和結束節點是否被鎖定,但似乎不應該,請參閱http://docs.neo4j.org/chunked/snapshot/transactions-locking.html –

+1

感謝您的鏈接..我看到我在尋找點沒有。 3在那個頁面上。 – user1925093

+0

不錯,很高興能夠提供幫助。隨意博客關於您的設置! –

回答

0

在第一種情況下,在R1(在N和N1之間)正在創建時N和N1將被寫入鎖定鎖定,這意味着其他對N或N1的寫入將被阻止但不會讀取(如果沒有讀取鎖定在閱讀之前手動發出)。

在R1以某種方式更改(屬性設置)的情況下,只有R1被鎖定。

如果您觀察到存在爭用問題,那麼通過將實體分解爲若干特定用途的子節點,您的解決方案非常合適。在我見過的大多數情況下,它都是關係類型的分裂......可能會通過計劃的特性來解決這個問題,以更好地處理密集連接的節點。這個功能可能會產生非常相似的效果。