Как избежать взаимоблокировок при удалении отношений

Я использую встроенный 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).


person Nicholas    schedule 02.08.2013    source источник
comment
Вы можете попытаться получить блокировку записи, вызвав метод resumeWriteLock как на узлах пользователя, так и на узлах элементов перед удалением связи.   -  person remigio    schedule 02.08.2013
comment
да. Но для моего обновления каждая транзакция предназначена для 1 user, поэтому я знаю, что это не является предметом спора. Я знаю, что items могут быть одинаковыми, однако я обращаюсь к ним по предсказуемой схеме, поэтому, даже если я блокирую его, это не должно быть тупиком на этом узле.   -  person Nicholas    schedule 02.08.2013


Ответы (1)


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

person Nicholas    schedule 02.08.2013