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.
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. –