Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure Cypher QL不';不执行原子查询_Clojure_Transactions_Neo4j_Cypher - Fatal编程技术网

Clojure Cypher QL不';不执行原子查询

Clojure Cypher QL不';不执行原子查询,clojure,transactions,neo4j,cypher,Clojure,Transactions,Neo4j,Cypher,我开始使用Neo4j,我注意到在更新我正在读取的节点上的属性时出现了一个非常糟糕的行为。我编写的clojure代码使用Neocons库与Neo4j通信: (ns ams.utils.t.test-cypher-error (:require [clojurewerkz.neocons.rest :as rest] [clojurewerkz.neocons.rest.nodes :as nodes] [clojurewerkz.neocons.

我开始使用Neo4j,我注意到在更新我正在读取的节点上的属性时出现了一个非常糟糕的行为。我编写的clojure代码使用Neocons库与Neo4j通信:

(ns ams.utils.t.test-cypher-error
  (:require [clojurewerkz.neocons.rest :as rest]
            [clojurewerkz.neocons.rest.nodes :as nodes]
            [clojurewerkz.neocons.rest.cypher :as cypher]))

(rest/connect! "http://192.168.0.101:7474/db/data")

(def counter-id (:id (nodes/create {:counter 0})))

(defn update-counter [] (cypher/query "START c = node({id}) SET c.counter = c.counter + 1 RETURN c.counter as counter" {"id" counter-id}))

(doall (apply pcalls (repeat 10 update-counter)))

(println "Counter:" ((comp :counter :data) (nodes/get counter-id)))

(nodes/destroy counter-id)
猜猜结果:

计数器:4

有时是5,有时是4,但这里有个问题:在
START
SET
子句之间,计数器的值发生了更改,但cypher没有捕捉到它

这里有两个问题:

  • 我做错什么了吗
  • Neo4j中是否有可行的唯一计数器rest生成算法

Neo4j版本是1.9RC1,提前感谢

您遇到的问题是neo4j没有隐式读取锁定。因此,有时会发生以下情况:

  • 查询1开始
  • 查询1将
    计数器
    值读取为3
  • 查询1将
    计数器的值设置为3+1=4
  • 查询2开始
  • 查询2将
    计数器
    值读取为4
  • 查询2组
    计数器
    值为4+1=5
  • 以下是有时会发生的事情:

  • 查询1开始
  • 查询2开始
  • 查询1将
    计数器
    值读取为3
  • 查询2将
    计数器
    值读取为3
  • 查询1将
    计数器的值设置为3+1=4
  • 查询2组
    计数器
    值为3+1=4
  • 在读锁定数据库(与大多数SQL Server一样)中,不可能出现第2种情况。查询2将启动,然后阻塞,直到查询1提交或回滚


    可能有一种方法可以显式设置读锁,但不能通过restapi。虽然我不能完全肯定它能给你想要的东西,但它看起来很有希望,而且REST也不支持它。

    你遇到的问题是neo4j没有隐式读取锁定。因此,有时会发生以下情况:

  • 查询1开始
  • 查询1将
    计数器
    值读取为3
  • 查询1将
    计数器的值设置为3+1=4
  • 查询2开始
  • 查询2将
    计数器
    值读取为4
  • 查询2组
    计数器
    值为4+1=5
  • 以下是有时会发生的事情:

  • 查询1开始
  • 查询2开始
  • 查询1将
    计数器
    值读取为3
  • 查询2将
    计数器
    值读取为3
  • 查询1将
    计数器的值设置为3+1=4
  • 查询2组
    计数器
    值为3+1=4
  • 在读锁定数据库(与大多数SQL Server一样)中,不可能出现第2种情况。查询2将启动,然后阻塞,直到查询1提交或回滚


    可能有一种方法可以显式设置读锁,但不能通过restapi。虽然我不能完全肯定它能给你想要的东西,但它看起来很有希望,而且REST也不支持它。

    我不了解clojure,所以请容忍我。对
    更新计数器
    的多个调用是否同时发生?或者更重要的是,这些密码查询是否会(大约)同时发送到服务器,而不同步地等待以前的调用完成?我不了解clojure,请耐心等待。对
    更新计数器
    的多个调用是否同时发生?或者更重要的是,这些密码查询是否会(大约)同时发送到服务器,而不同步地等待以前的调用完成?是的,pcall驱动函数的并行执行。您已经证实了我对Neo4J中默认读取锁定行为的担忧。关于事务API,不幸的是,我只想使用RESTAPI(如我在问题中所述),它不允许用户指定锁和并发行为AFAIK。你能修改一下答案吗?这样我就可以接受了?(顺便说一句,无论如何我显然投了更高的票!)@VincenzoMaggio完成了。很抱歉给你的游行泼冷水:(没问题!我已经找到了一种CAS随机化算法的可能解决方法,我只是想知道问题是否确实是因为没有读锁定系统,以及是否存在标准方法,感谢您的帮助!是的,PCall驱动函数的并行执行。您已经证实了我对默认读锁定的担忧Neo4J中的并发行为。关于事务API,不幸的是,我只想使用REST API(如我在问题中所述),它不允许用户指定锁和并发行为。请您修改答案,以便我可以接受它?(顺便说一句,我显然对它投了更高的票!)@VincenzoMaggio Done。很抱歉给您带来麻烦:(没问题!我已经找到了一种可能的CAS随机算法的解决方法,我只是想知道问题是否确实是由于没有读取锁定系统,以及是否存在标准方法,谢谢您的帮助!