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),最好在另一个问题中清楚。