Я использую встроенный 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
).
Вы можете попытаться получить блокировку записи, вызывая метод * приобретатьWriteLock * как для узлов пользователя, так и для элементов, прежде чем удалять отношения. – remigio
Да. Но для моего обновления каждая транзакция предназначена для 1 'пользователя', поэтому я знаю, что это не противоречит. Я знаю, что «элементы» могут быть одинаковыми, но я обращаюсь к ним в предсказуемом шаблоне, поэтому, даже если я блокирую его, он не должен быть тупиком на этом узле. – Nicholas