如何使用cypher系统地重现neo4j上的死锁?

时间:2017-05-15 21:08:39

标签: database neo4j cypher

我遇到了死锁问题,我希望有一种方法可以让每个查询花费更长时间,这样我就可以系统地重现死锁。有没有人知道如何使用Cypher实现这一目标?我可能要么每次创建一个临时锁定节点,要么执行一个需要更长时间才能执行的查询?

提前致谢!

更新

我尝试使用apoc.lock方法,这是我最终得到的查询:

    sb.append("MERGE (user:User {id: {1}}) ON CREATE SET user.id = {1}, user.name = {2}, user.createTime = timestamp()");
    sb.append(" WITH user AS user CALL apoc.lock.nodes([user])");
    sb.append(" MERGE (user2:User {id: {1}}) ON MATCH SET user2.updateTime = timestamp()");
    sb.append(" MERGE (session:Session {id: {3}}) ON CREATE SET session.id = {3}");
    sb.append(" MERGE (user)-[:STARTED]->(session)");

    sb.append(" WITH 5000 AS duration CALL apoc.util.sleep(duration)");    
    sb.append(" MERGE (user3:User {id: {1}}) ON MATCH SET user3.closeTime = timestamp(), user3.timeDiff = user3.closeTime - user3.createTime");

3 个答案:

答案 0 :(得分:2)

APOC Proceduresapoc.util.sleep(),您可以在Cypher查询中调用它来休眠几毫秒

例如:

...
// after cypher which obtains locks
CALL apoc.util.sleep(5000) // sleep 5 seconds

APOC还有locking on nodes的程序。

答案 1 :(得分:0)

您可以多次增加并发请求数和/或重复相同的请求。

有APOC程序可以帮助后者。例如,apoc.periodic.repeat将重复执行相同的Cypher语句,直到您致电apoc.periodic.cancel取消。

答案 2 :(得分:0)

我补充一点,APOC有一个运行Cypher(apoc.cypher.run),所以你可以在一个节点上获得一个写锁,然后使用APOC递归地对它进行另一次写操作,这应该创建陷入僵局。