Multithreading Neo4j 2.2密码锁回归?

Multithreading Neo4j 2.2密码锁回归?,multithreading,neo4j,cypher,Multithreading,Neo4j,Cypher,我有一些代码需要在节点上获取写锁。由于各种原因,使用Java API获取锁很不方便,因此我在Cypher 2.1中通过在节点上设置一个伪值来获取锁。 然后在另一个查询中使用该节点。 在2.1中,调用SET n._lock=1足以在节点上为事务的其余部分获取写锁。 但是,当我升级到2.2时,有一个测试失败了,因为在同一事务中的两个查询之间,写锁似乎丢失了。(我正在嵌入式模式下使用Neo4j社区版。) 因此,我有两个类似的问题(在同一个TX中): 我有一个单元测试,它并行多次调用此代码,并验证后一个

我有一些代码需要在节点上获取写锁。由于各种原因,使用Java API获取锁很不方便,因此我在Cypher 2.1中通过在节点上设置一个伪值来获取锁。 然后在另一个查询中使用该节点。 在2.1中,调用SET n._lock=1足以在节点上为事务的其余部分获取写锁。 但是,当我升级到2.2时,有一个测试失败了,因为在同一事务中的两个查询之间,写锁似乎丢失了。(我正在嵌入式模式下使用Neo4j社区版。)

因此,我有两个类似的问题(在同一个TX中):

我有一个单元测试,它并行多次调用此代码,并验证后一个代码的互斥属性,即,由于第一个查询中的写锁,后一个代码没有并行运行(测试中只有一个“a”节点)。该测试在2.1中通过,但在2.2中失败。如果我将第二个查询修改为

    MATCH (a:A)
    WHERE ID(a) = {aId}
    SET a._lock = 1
    WITH a
    MATCH (b:B)-[:IS_AT]->(a:A)
    ...
考试通过了。
这似乎是TX在第一次和第二次查询之间“丢失”写锁的证据,这令人不安。有人能解释这种行为吗?

Jonathan,你是如何执行的?也许你可以分享完整的代码?记住,事务是线程绑定的!如果您能为此提供一个失败的单元测试,那将是一件令人惊讶的事情。打开了这个问题:正如我在那个问题中提到的,为您提供一个测试用例可能会很棘手,因为不幸的是,有很多依赖项。但我会看看我能做些什么。我提到的两个查询在同一个TX中,它们实际上在同一个线程中,在同一个方法中一个接一个地运行。就我所知,与第二个版本的唯一区别在于,锁是在执行互斥检查的同一个查询中获取的(在第二个版本中,仅在添加WITH子句之前的“SET a.。\u lock=1”)。现在我已经确认这不是预期的行为,我将尝试提供更多有用的调试信息。您是否真的为这两个查询启动外部tx?否则它们将在两个单独的事务中运行!!!即使它们在同一个线程中。乔纳森,你如何执行它们?也许你可以分享完整的代码?记住,事务是线程绑定的!如果您能为此提供一个失败的单元测试,那将是一件令人惊讶的事情。打开了这个问题:正如我在那个问题中提到的,为您提供一个测试用例可能会很棘手,因为不幸的是,有很多依赖项。但我会看看我能做些什么。我提到的两个查询在同一个TX中,它们实际上在同一个线程中,在同一个方法中一个接一个地运行。就我所知,与第二个版本的唯一区别在于,锁是在执行互斥检查的同一个查询中获取的(在第二个版本中,仅在添加WITH子句之前的“SET a.。\u lock=1”)。现在我已经确认这不是预期的行为,我将尝试提供更多有用的调试信息。您是否真的为这两个查询启动外部tx?否则它们将在两个单独的事务中运行!!!即使他们在同一条线上。
    MATCH (a:A)
    WHERE ID(a) = {aId}
    SET a._lock = 1
    WITH a
    MATCH (b:B)-[:IS_AT]->(a:A)
    ...