2015-08-28 3 views
1

Недавно я обнаружил, что условие гонки существует при выполнении параллельных операторов MERGE. В частности, дублирующие узлы могут быть созданы в сценарии, когда узел создается после этапа MATCH, но до этапа CREATE данного MERGE.Есть ли условие гонки при создании уникальных путей?

В некоторых случаях это можно обрабатывать с использованием уникальных ограничений для объединенных узлов; однако это не соответствует сценариям, где:

  1. Не существует единственного уникального свойства для обеспечения соблюдения (например, пары свойств должны быть уникальными, а индивидуальные - нет).
  2. Пытается объединить отношения и пути.

Решает эту проблему с помощью CREATE UNIQUE (или существуют те же подводные камни)? Если да, это единственный вариант? Похоже, что полезность MERGE довольно сильно уменьшена, когда она фактически не может гарантировать уникальность соединяемого пути или узла ...

+0

В соответствии с ответом на [этот вопрос о Grokbase] (http://grokbase.com/t/gg/neo4j/137q6a6rg5/are-merge-operations-in-cypher-atomic) предполагается, что «MERGE» атомный по окончательной версии neo4j 2.0. Если вы обнаруживаете неатомное поведение, вы должны [создать проблему neo4j] (http://grokbase.com/t/gg/neo4j/137q6a6rg5/are-merge-operations-in-cypher-atomic). – cybersam

+0

[Это правильная ссылка] (https://github.com/neo4j/neo4j/issues) для создания проблемы. Я только что проверил, и [эта существующая проблема] (https://github.com/neo4j/neo4j/issues/5091) может быть для той же проблемы. – cybersam

+0

Для составных свойств вы можете использовать уникальное ограничение для массива prop. –

ответ

0

Когда операторы MERGE выполняются одновременно, могут возникать такие ситуации. В принципе, каждая транзакция получает вид графика в первой точке чтения и не увидит обновления, сделанные после этой точки (с некоторыми вариантами). Основное исключение - узлы с ограниченным ограничением, где Neo4j будет инициализировать новый считыватель из индекса при чтении, независимо от того, что было ранее прочитано в транзакции.

Обходным решением может быть создание свойства «фиктивного» и уникального ограничения на него и одной из меток узлов. В Neo4j 2.2.5 это должно работать, чтобы обойти вашу проблему.

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