neo4j-ogm在transaction / concurrently中执行时返回null书签

时间:2017-10-27 07:35:24

标签: java multithreading neo4j transactions neo4j-ogm

场景1:
当我在不打开事务的情况下执行以下代码时,它会成功返回书签。

    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()返回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

无论是单线程还是多线程,都会发生这种情况。

场景2:
即使没有事务,当我尝试从多个线程执行getLastBookmark()时,它也会间歇性地返回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$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

有什么想法吗?

我正在使用neo4j-ogm-core:2.1.5&amp; neo4j-ogm-bolt-driver:2.1.5依赖。

1 个答案:

答案 0 :(得分:1)

书签与交易相关联。它们在交易结束时由数据库发送。

如果在未事先打开事务的情况下使用query,则自动提交事务由OGM管理(它是隐式事务)。执行query方法后,书签即可使用。

在管理自己的事务(显式事务)时,您必须等待事务结束才能使书签可用。

关于第二点,请尝试更新驱动程序和/或OGM。如果问题仍然存在,请分享一个重现问题的示例项目(您可以使用一些模板here),最好在另一个问题中清楚。