neo4j-ogm returns 在 transaction/concurrently 中执行时为空书签
neo4j-ogm returns null bookmark when executed in transaction/concurrently
场景一:
当我在没有打开事务的情况下执行以下代码时,它 returns 书签成功。
Session session2 = sessionFactory.openSession();
session2.query("MATCH (n) RETURN count(n)", new HashMap<>());
String lastBookmark = session2.getLastBookmark();
System.out.println("WITHOUT" + " - " + lastBookmark);
输出:
WITHOUT - neo4j:bookmark:v1:tx6776
当我明确获取交易时,getLastBookmark() returns 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();
输出:
With - null
无论单线程还是多线程,这种情况总是会发生。
场景二:
当我尝试从多个线程执行 getLastBookmark() 时,即使没有事务,它也会间歇性地 returns null。
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");
}
}
});
输出:
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(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
有什么想法吗?
我正在使用 neo4j-ogm-core:2.1.5 & neo4j-ogm-bolt-driver:2.1.5 依赖项。
书签与交易相关联。它们由数据库在事务结束时发送。
当您使用query
之前没有打开事务时,自动提交事务由OGM管理(它是一个隐式事务)。书签在执行 query
方法后立即可用。
在管理自己的事务(显式事务)时,您必须等待事务结束才能使用书签。
关于你的第二点,尝试更新驱动程序 and/or OGM。如果问题仍然存在,请分享一个重现该问题的示例项目(您可以使用一些模板 here),最好在另一个问题中清楚。
场景一:
当我在没有打开事务的情况下执行以下代码时,它 returns 书签成功。
Session session2 = sessionFactory.openSession();
session2.query("MATCH (n) RETURN count(n)", new HashMap<>());
String lastBookmark = session2.getLastBookmark();
System.out.println("WITHOUT" + " - " + lastBookmark);
输出:
WITHOUT - neo4j:bookmark:v1:tx6776
当我明确获取交易时,getLastBookmark() returns 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();
输出:
With - null
无论单线程还是多线程,这种情况总是会发生。
场景二:
当我尝试从多个线程执行 getLastBookmark() 时,即使没有事务,它也会间歇性地 returns null。
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");
}
}
});
输出:
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(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
有什么想法吗?
我正在使用 neo4j-ogm-core:2.1.5 & neo4j-ogm-bolt-driver:2.1.5 依赖项。
书签与交易相关联。它们由数据库在事务结束时发送。
当您使用query
之前没有打开事务时,自动提交事务由OGM管理(它是一个隐式事务)。书签在执行 query
方法后立即可用。
在管理自己的事务(显式事务)时,您必须等待事务结束才能使用书签。
关于你的第二点,尝试更新驱动程序 and/or OGM。如果问题仍然存在,请分享一个重现该问题的示例项目(您可以使用一些模板 here),最好在另一个问题中清楚。