#neo4j #cypher #neo4j-apoc
#neo4j #шифр #neo4j-apoc
Вопрос:
Я использую запрос apoc.periodical.iterate для хранения миллионов данных. Поскольку данные могут содержать дубликаты, я использую действие СЛИЯНИЯ для создания узлов, но, к сожалению, всякий раз, когда данные дублируются, весь пакет выдает ошибку, подобную этой
«LockClient [200] не может дождаться RWLock ресурса [УЗЕЛ (14), хэш = 1645803399], поскольку => LockClient[200] <-[:HELD_BY]- RWLock[УЗЕЛ (101)»
- Изменение parallel как false работает нормально
- Кроме того, при удалении дубликатов запрос передается успешно
Но оба вышеуказанных решения требуют больше времени, так как имеют дело с миллионами данных. Есть ли какое-либо альтернативное решение, например, заставить его ждать блокировки
Ответ №1:
Вы не можете использовать parallel:true
, потому что вы создаете отношения в своем запросе. Каждый раз, когда вы хотите добавить связь с узлом, механизм шифрования добавляет к узлу блокировку записи, и другие процессы не могут добавить к этому конкретному узлу. Вот почему у вас есть исключение блокировки записи. Вы мало что можете сделать, кроме как запустить его с parallel:false
настройкой.
Ответ №2:
Чтобы избежать взаимоблокировок, одновременные запросы, обновляющие базу данных, должны избегать касания одних и тех же узлов или связей (включая узлы на обоих концах этих связей). Один из способов добиться этого — найти способ заставить параллельные запросы работать с непересекающимися подграфами.
Или вы можете повторить запросы, которые выдают DeadlockDetectedException
. В документах показан пример того, как это сделать.