Neo4J Cypher查询等同于选择进行更新

问题描述

我有两个正在运行的应用程序实例。

每个人都有一个在计划的作业上运行的密码查询,以获取DB的数据并将其发送给服务。问题在于,每个实例都会抓取数据并将其发送出去,因此服务会收到重复的数据。

到目前为止,我所做的是将一个属性设置为当从数据库中匹配/查询数据时将其设置为true的标志。

所以我的查询是这样的:

比赛(n) 其中sendData = false 设置sendData = true 返回n。

我希望数据将被一个实例通过MATCH查询中的SET锁定,而另一个实例将无法捕获或修改它,但是确实如此,因此仍然将重复的数据发送到服务

例如,在oracle中,我将执行“选择更新”,然后一个实例将在选择过程中抓住锁,而在执行更新时,一个实例将执行锁定,而另一个实例将引发异常。

我只是对DB进行图表绘制的新手,所以如果术语不完全正确,我深表歉意。 谢谢

解决方法

您可以使用APOC atomic property update过程之一从原子上更新sentData属性。

例如,即使存在竞争条件(两个事务都看到错误的sentData),此查询也应确保只有一个事务将返回n

MATCH (n:Foo)
WHERE NOT n.sentData
CALL apoc.atomic.update(n,'sentData','true',5) YIELD oldValue,newValue
WHERE apoc.convert.toBoolean(newValue) AND NOT apoc.convert.toBoolean(oldValue)
RETURN n