2017-10-27 3 views
2

Szenario 1:
Wenn ich den folgenden Code ausführen, ohne eine Transaktions zu Öffnung, kehrt it Bookmark erfolgreich.Neo4j-OGM null zurück, wenn in Bookmark-Transaktion ausgeführt/gleichzeitig

Session session2 = sessionFactory.openSession(); 
    session2.query("MATCH (n) RETURN count(n)", new HashMap<>()); 
    String lastBookmark = session2.getLastBookmark(); 
    System.out.println("WITHOUT" + " - " + lastBookmark); 

Ausgang:

WITHOUT - neo4j:bookmark:v1:tx6776 

Wenn ich eine Transaktion explizit erwerben, getLastBookmark() gibt den Wert null.

Session session = sessionFactory.openSession(); 
    session.beginTransaction(Transaction.Type.READ_ONLY); 
    session.query("MATCH (n) RETURN count(n)", new HashMap<>()); 
    System.out.println("With" + " - " + session.getLastBookmark()); 
    session.getTransaction().close(); 

Output:

With - null 

Dies geschieht immer unabhängig von Einzel- oder Mehrfachgewinde. 2

Szenario:
Auch ohne Transaktion, wenn ich versuche getLastBookmark() von mehreren Threads auszuführen, es null intermittierend zurückgibt.

 Thread t2 = new Thread(() -> { 
     for (int i = 0; i < 100; i++) { 
      Session session = sessionFactory.openSession(); 
      session.query("MATCH (n) RETURN count(n)", new HashMap<>()); 
      String lastBookmark = session.getLastBookmark(); 
      System.out.println("lastBookmark" + " - " + lastBookmark); 
      if (lastBookmark == null) { 
       throw new RuntimeException(" lastBookmark NULL"); 
      } 
     } 
    }); 

    Thread t1 = new Thread(() -> { 
     for (int i = 0; i < 100; i++) { 
      Session session = sessionFactory.openSession(); 
      session.query("MATCH (n) RETURN count(n)", new HashMap<>()); 
      String lastBookmark = session.getLastBookmark(); 
      System.out.println("lastBookmark" + " - " + lastBookmark); 
      if (lastBookmark == null) { 
       throw new RuntimeException(" lastBookmark NULL"); 
      } 
     } 
    }); 

Ausgang:

lastBookmark - neo4j:bookmark:v1:tx6776 
lastBookmark - neo4j:bookmark:v1:tx6776 
lastBookmark - neo4j:bookmark:v1:tx6776 
lastBookmark - null 
Exception in thread "Thread-2" java.lang.RuntimeException: lastBookmark NULL 
    at MyTest.lambda$testSession$4(MyTest.java:173) 
    at java.lang.Thread.run(Thread.java:745) 
lastBookmark - neo4j:bookmark:v1:tx6776 
lastBookmark - neo4j:bookmark:v1:tx6776 
lastBookmark - neo4j:bookmark:v1:tx6776 
lastBookmark - neo4j:bookmark:v1:tx6776 
lastBookmark - neo4j:bookmark:v1:tx6776 

Irgendwelche Ideen?

Ich benutze neo4j-ogm-core: 2.1.5 & neo4j-ogm-Schraubenzieher: 2.1.5 Abhängigkeiten.

Antwort

1

Die Lesezeichen sind an Transaktionen gebunden. Sie werden am Ende der Transaktionen von der Datenbank gesendet.

Wenn Sie query verwenden, ohne zuvor eine Transaktion zu öffnen, wird eine Autocommit-Transaktion von OGM verwaltet (es handelt sich um eine implizite Transaktion). Das Lesezeichen ist direkt nach der Ausführung der Methode query verfügbar.

Wenn Sie die Transaktion (explizite Transaktion) verwalten, müssen Sie das Ende der Transaktion warten, bis das Lesezeichen verfügbar ist.

In Bezug auf Ihren zweiten Punkt, versuchen Sie, Treiber und/oder OGM zu aktualisieren. Wenn das Problem weiterhin besteht, teilen Sie ein Beispielprojekt, das das Problem reproduziert (Sie können einige Vorlagen verwenden here), vorzugsweise in einer anderen Frage für Klarheit.

+0

ja, indem ich die Transaktion beginne, bekomme ich ein Lesezeichen in Szenario 1. Das in Szenario 2 beschriebene Problem besteht nach der Aktualisierung der Abhängigkeiten noch. –

Verwandte Themen