2013-08-02 5 views
0

Я использую встроенный neo4j в качестве веб-службы. Часть моей модели так:Избегание взаимоблокировок при удалении связей

(user)-[HAS_ITEM]->(item) 

Теперь у меня есть несколько удалений приходить в одно время для различных users, но для некоторых из той же items. Я знаю, что я получу тупики, если я сделаю эти обновления, так как Neo4j заблокирует узел при попытке удалить. Рекомендуемая стратегия, которую я видел, заключалась в том, чтобы заказать эти обновления, поэтому я беру список узлов item, которые мне нужно удалить и заказать, поэтому я всегда удаляюсь в каком-то предсказуемом порядке. Однако, когда я удаляю отношения, у меня возникает другая проблема, связанная с блокировкой отношений, хотя они и являются разными отношениями. Вот ошибка:

Details: 'Transaction(43141)[STATUS_ACTIVE,Resources=1] can't wait on resource RWLock[Relationship[620613598]] since => Transaction(43141)[STATUS_ACTIVE,Resources=1] <-[:HELD_BY]- RWLock[Node[620]] <-[:WAITING_FOR]- Transaction(43142)[STATUS_ACTIVE,Resources=0] <-[:HELD_BY]- RWLock[Relationship[620613598]]'. 

Details: 'Transaction(43746)[STATUS_ACTIVE,Resources=0] can't wait on resource RWLock[Node[620]] since => Transaction(43746)[STATUS_ACTIVE,Resources=0] <-[:HELD_BY]- RWLock[Lockable relationship #620634878] <-[:WAITING_FOR]- Transaction(43747)[STATUS_ACTIVE,Resources=1] <-[:HELD_BY]- RWLock[Node[620]]'. 

Как я могу удалить эту проблему? Я считал, что узел был единственным спором здесь, однако, похоже, существует блокировка отношений, к которым ведут транзакции, хотя каждая транзакция не должна обрабатывать удаление этих отношений (удаление является взаимоисключающим к user).

+0

Вы можете попытаться получить блокировку записи, вызывая метод * приобретатьWriteLock * как для узлов пользователя, так и для элементов, прежде чем удалять отношения. – remigio

+0

Да. Но для моего обновления каждая транзакция предназначена для 1 'пользователя', поэтому я знаю, что это не противоречит. Я знаю, что «элементы» могут быть одинаковыми, но я обращаюсь к ним в предсказуемом шаблоне, поэтому, даже если я блокирую его, он не должен быть тупиком на этом узле. – Nicholas

ответ

0

Neo4j блокирует отношения, а также 4 других отношения, связанных в связанном списке, которые хранятся на диске. Вот почему я получаю сообщение, которое я делаю. Решение здесь состоит в том, чтобы либо повторить тупиковое удаление, либо установить блокировки вокруг обоих узлов явно.

Смежные вопросы