我正在使用这个例子,http://neo4j.com/docs/stable/cypher-cookbook-newsfeed.html,为我的用户维护新闻提要。因此,我使用以下内容发布状态更新:
MATCH (me)
WHERE me.name='Bob'
OPTIONAL MATCH (me)-[r:STATUS]-(secondlatestupdate)
DELETE r
CREATE (me)-[:STATUS]->(latest_update { text:'Status',date:123 })
WITH latest_update, collect(secondlatestupdate) AS seconds
FOREACH (x IN seconds | CREATE (latest_update)-[:NEXT]->(x))
RETURN latest_update.text AS new_status我在这方面遇到了一个严重的缺陷,不知道如何修复它。在一个非常罕见的场景中,两个状态更新完全同时发布(例如。Neo4j创建了两个状态更新,而不是替换当前状态。这导致一个更大的问题,在那里,下一个更新张贴两次!
发布于 2016-01-06 17:09:26
这看起来像是比赛条件。要解决这个问题,您基本上需要确保在给定的时间只有一个事务正在修改这个特定用户的状态。
Neo4j的Java确实能够设置锁以实现这一点。Cypher对此没有明确的特性,但是您可以删除一个不存在的属性来强制对给定节点进行锁定。在锁就位后,并发事务需要等待,锁的持有者将完成他的事务。
所以,在你的陈述中尽早锁定:
MATCH (me)
WHERE me.name='Bob'
REMOVE me._not_existing // side effect: grab a lock early
WITH me
OPTIONAL MATCH (me)-[r:STATUS]-(secondlatestupdate)
DELETE r
CREATE (me)-[:STATUS]->(latest_update { text:'Status',date:123 })
WITH latest_update, collect(secondlatestupdate) AS seconds
FOREACH (x IN seconds | CREATE (latest_update)-[:NEXT]->(x))
RETURN latest_update.text AS new_statushttps://stackoverflow.com/questions/34631330
复制相似问题