【问题标题】:Neo4j and Php handle counter within transactionNeo4j 和 Php 在事务中处理计数器
【发布时间】:2013-08-26 17:50:27
【问题描述】:

场景是这样的:

我创建了一个名为 counter node 的节点。它的初始值为 0,并随着用户在我的网站上创建帐户而递增。

所以发生了三个操作来操作这个:

读取counter node
在 php 中做一些逻辑。这里就像对计数器节点的先前值 +1
写入计数器节点的新值

现在的问题是,如果两个或更多用户在同一时间到达并创建这样的条件

在第一个用户向计数器节点写入新值之前,第二个用户正在读取它。因此,这将使我的“计数器节点”的值处于不稳定状态。

希望你明白我的意思..

任何解决方案??

我正在使用 neo4j 1.9.5 和 php

PHP 贾德尔:

https://github.com/jadell/Neo4jPHP

我听说过批处理,但不确定它是否有效。如果有任何解决方案,请给我一个简短的例子。

感谢阿米特·阿加瓦尔

【问题讨论】:

    标签: neo4j counter neo4jphp


    【解决方案1】:

    纯 REST API 无法做到这一点。我会用 Cypher 试试,可能是这样的:

    START n=node(123)
    SET n.noOfUsers = n.noOfUsers + 1
    RETURN n.noOfUsers
    

    这应该适用于最新版本的 Cypher http://console.neo4j.org/?id=tnkldf

    【讨论】:

    • 你好乔希,我也试过了,我不知道为什么有时它会更新正确的计数,否则是随机的。这是代码gist.github.com/0xvoila/6349357
    【解决方案2】:

    Neo4j 2.0 具有强制事务。如果您在事务中增加您的计数器属性 noOfUsers,我认为这将有助于您解决并发问题。

    只是一个想法,但首先是一个问题:计数器的目的是什么?是用于分配用户 ID,还是仅用于提供信息?如果是后者,你必须有一个准确的计数吗?例如,如果您想要 twitter 或 facebook 用户的总数,如果计数减少了几个是否重要?如果计数不需要精确(或在特定时间点精确),您可以运行一个定期进程来返回用户节点的计数,例如:

    MATCH n:User
    return count(*)
    

    这也将帮助您处理已删除的节点。

    【讨论】:

    • 你好 David,它的目的是生成 userIds .. 所以任何不一致都可能让我陷入大问题 ..:( ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多