2013-08-29 19 views
0

在實時,事務,多用戶neo4J嵌入式系統上遇到了死鎖問題。你能否指出我會寫出哪些文件來說明每個圖表操作獲得的鎖 - 我特別關心添加和刪除關係,因爲這似乎會導致大多數的死鎖。爲每個圖動作獲取了什麼鎖

例如 加關係:寫置於兩端節點上的鎖(這是真的,寫鎖也被放置在存在兩端節點的所有關係?)

刪除關係:寫放在關係和兩個鎖(對於兩個端節點,寫入鎖定是否也放置在所有關係上?)。
爲什麼在關係刪除期間需要鎖定末端節點?

謝謝

回答

2

當您添加關係時,圖形會鎖定所涉及的節點。如果以不可預知的方式鎖定項目,則可能會發生死鎖。對於我來說,我創建了一對多的關係,所以我們可以通過節點ID排序許多節點,這可以防止我們陷入僵局。

當您刪除時,它更復雜。它鎖定涉及的節點,但在封面下將所有關係存儲爲雙向鏈接列表,因此,當您刪除關係時,必須鎖定上一個和下一個鏈接,以便將它們鏈接在一起而不會出現問題。這是你無法預測的,因爲你實際上沒有能力獲得這些ID。

最好的辦法是做一個死鎖重試策略。做一個try{}catch(DeadlockDetectedException){},如果你捕捉到死鎖異常,重試(我通過把整個操作放在while循環中,直到我想要的操作沒有死鎖時纔會中斷)。

+0

感謝您分享您的體驗。是否有關於每個操作獲取的特定鎖的文檔?如果沒有,這對我對產品的評估會有所幫助。我需要一個分析和實時更新系統!我知道neo4j說這就是他們的產品提供的,但我不能只是將每個屬性更新包裝在一個真正的循環中,並希望它最終能夠正常工作。我們的系統有數百個同時需要高性能的用戶。在那裏的其他人有相同的情況? –

+0

除了挖掘源代碼外,沒有特定的文檔,這是我發現這種情況的方式。您不必包裝每筆交易,但刪除是棘手的。 while循環不會花費很多時間,除非您有長時間的暫停操作,通常在1次重試後我的死鎖就會解決。 – Nicholas

1

添加和刪除關係也鏈表需要更新到他們有什麼關係,兩個節點的引用。換句話說,添加和刪除關係意味着寫入兩端的節點。因此Neo4j需要爲所有三個實體進行寫入鎖定。

不幸的是,文檔看起來過時了。在Neo4j中鎖定的內容要多於該頁面顯示的內容,特別是現在它支持諸如獨特約束之類的內容。

尼古拉斯關於試圖通過他們的身份證訂購實體的建議,您想要寫信給他們,值得嘗試。您也可以嘗試在圖中分割出所有事物,這樣,否則衝突的事務處理相同數據的可能性就會降低。

相關問題