想象一下这样的查询:
match (i:QuestionOrder)
set i.count=i.count+1
merge (q:Question {text: '+text here+', index: i.count})
return q如果集合出现在相同的事务中,Neo4j保证写锁,这是由node-ne4j中的相同查询所暗示的。但是,我得到了以下输出:
[
{
"columns":["q"],
"data":[{"text":"Have Kids...","index":1,"_id":542}]
},
{
"columns":["q"],
"data":[{"text":"You are...","index":1,"_id":545}]
}
]据我所知,锁应该防止index是相同的。我是不是漏掉了什么?我该如何解决这个问题?
发布于 2015-08-09 01:54:28
更改此查询以添加额外的测试可能会对并发工作有所帮助。如果您有两个并发事务,则锁在set操作时被抢占。因此,两者都已经读取了i.count,并且正在等待相同的值。
所以你要么早点拿到锁:
match (i:QuestionOrder)
set i.lock = NOT i.lock
set i.count=i.count+1
merge (q:Question {text: '+text here+', index: i.count})
return q或者添加一个额外的检查来避免合并发生(然后你必须重试)
match (i:QuestionOrder)
WITH i, i.count + 1 as new_count
set i.count = new_count
WITH i, new_count
WHERE i.count = new_count
merge (q:Question {text: '+text here+', index: i.count})
return q或者在同一个tx中发送两个不同的语句,其中第一个语句进行锁定。
https://stackoverflow.com/questions/31876741
复制相似问题