我遇到了死锁问题,我希望有一种方法可以让每个查询花费更长时间,这样我就可以系统地重现死锁。有没有人知道如何使用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");
答案 0 :(得分:2)
APOC Procedures有apoc.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递归地对它进行另一次写操作,这应该创建陷入僵局。