首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j新闻提要有缺陷吗?

Neo4j新闻提要有缺陷吗?
EN

Stack Overflow用户
提问于 2016-01-06 10:53:35
回答 1查看 71关注 0票数 1

我正在使用这个例子,http://neo4j.com/docs/stable/cypher-cookbook-newsfeed.html,为我的用户维护新闻提要。因此,我使用以下内容发布状态更新:

代码语言:javascript
复制
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创建了两个状态更新,而不是替换当前状态。这导致一个更大的问题,在那里,下一个更新张贴两次!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-06 17:09:26

这看起来像是比赛条件。要解决这个问题,您基本上需要确保在给定的时间只有一个事务正在修改这个特定用户的状态。

Neo4j的Java确实能够设置锁以实现这一点。Cypher对此没有明确的特性,但是您可以删除一个不存在的属性来强制对给定节点进行锁定。在锁就位后,并发事务需要等待,锁的持有者将完成他的事务。

所以,在你的陈述中尽早锁定:

代码语言:javascript
复制
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_status
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34631330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档