2016-05-05 19 views
0

Ich arbeite mit Neo4j in einer Stream-Monitoring-Anwendung. Mein Stream ist wirklich leicht, etwa 8 bis 10 Transaktionen pro Sekunde.Multithread-Upsert in Neo4j

Wenn ich meine Transaktionen in Neo4j speichern, sobald sie ankommen, mit mehr als einem Thread habe ich einen Deadlock-Fehler und einige Knoten und Beziehungen werden nicht gespeichert.

Gibt es irgendeine Art von Lösung, in Konfiguration oder Code, die ich verwenden kann, um diese Art von Problem zu lösen?

Vielen Dank im Voraus

Antwort

1

Hier einige allgemeine Informationen darüber, wie Deadlocks zu vermeiden und zu behandeln.

  1. Sie müssen Ihren Code oder Ihre Cypher-Abfragen so schreiben, dass Deadlocks vermieden werden.
  2. The Deadlocks doc page bietet einige Informationen dazu, vor allem, wenn Sie die Java-API verwenden.
  3. Sie sollten auch auf die default locking behavior von neo4j achten.
  4. Beachten Sie, dass es an outstanding neo4j Issue über die inkonsistente Reihenfolge gibt, in der Knoten beim Erstellen versus Löschen einer Beziehung gesperrt sind.
  5. Bei der Verwendung von Cypher gibt es keine explizite Unterstützung für Knoten-/Beziehungssperren. Sie können sich nur auf das Standardsperrverhalten verlassen. the Isolation levels doc page beschreibt jedoch eine Problemumgehung, die hilfreich sein kann.
  6. Es kann unmöglich sein, Deadlocks insgesamt zu verhindern, aber Sie können sie definitiv weniger wahrscheinlich machen.
  7. Wenn Sie den Deadlock-Statuscode "Neo.TransientError.Transaction.DeadlockDetected" (oder in der Tat alle status code beginnend mit "Neo.TransientError") erhalten, sollten Sie später versuchen (idealerweise nach einem zufälligen Intervall).