2014-02-26 201 views
2

我實現Neo4j的客戶端BG benchmark。有11個功能,模擬11種不同的社交活動。每個函數都有自己的事務主體。但是當我使用100個線程運行時,有時會引發死鎖檢測異常。Neo4j的死鎖

我有用戶爲節點和友誼的關係。我邀請朋友,拒絕朋友,接受朋友並融合所有有兩個用戶的朋友作爲他們的投入。他們工作的方式是獲取一個用戶節點的所有關係,並找到與另一個用戶節點的關係。

是任何人察覺鎖定的Neo4j的機制呢?

回答

4

你可以閱讀有關在Neo4j documentation死鎖。當您對同一實體(節點或關係)進行併發修改時,可能會出現這些錯誤。請注意,在修改實體時,可能會使用多個鎖:例如,對於關係,將採用通過關係連接的兩個節點上的鎖。

+0

BG基準選取兩個隨機用戶,並調用與輸入隨機的行動之一。但每次選擇兩個用戶時,它會鎖定它們,所以其他線程將無法選擇這些用戶。通過這個我的意思是兩個線程不可能選擇兩個相同的用戶。 – user3353973

+1

這將有助於描述你在交易中做什麼。僵局可能來自對關係的鎖定:假設你有用戶A和B,他們有兩個共同的朋友C和D:A - C - B和A - D - B。同時移除A和B可能會導致死鎖,因爲兩者都需要C和D上的鎖。 – RaduK

+0

有一個用戶查看好友列表操作,該操作將鎖定該特定用戶的所有友誼關係以對其進行計數。假設函數viewFriend(u1)將鎖定所有用戶u2-u10。同時u2可能想要邀請u10,它需要鎖定u2和u10,但它不能!所以我認爲這是因爲對圖的任何訪問都會獲得相同的鎖: - ? – user3353973

1

默認鎖定行爲:

  1. 當添加,改變或節點或關係的寫入鎖將所述特定節點或關係上採取上除去的特性。
  2. 創建或刪除節點時,將爲特定節點執行寫入鎖定。
  3. 創建或刪除關係時,將對特定關係及其兩個節點執行寫入鎖定。

的鎖將被添加到該交易,並在交易完成後公佈。

  1. 設計數據庫以最小鎖定的方式存在。
  2. 避免使用同一個節點,並且關係被許多用戶在同一實例中使用。保持這些節點和關係的最小交易週期。