Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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
Ruby on rails Rails中的Rapid Fire AJAX请求导致Apache上的数据覆盖 问题_Ruby On Rails_Ajax_Apache_Fastcgi - Fatal编程技术网

Ruby on rails Rails中的Rapid Fire AJAX请求导致Apache上的数据覆盖 问题

Ruby on rails Rails中的Rapid Fire AJAX请求导致Apache上的数据覆盖 问题,ruby-on-rails,ajax,apache,fastcgi,Ruby On Rails,Ajax,Apache,Fastcgi,在使用FCGI将rails 3.2.8应用程序从WEBrick移动到Apache之后,我遇到了一个问题 该应用程序包括一个用javascript编写的游戏,它发送大量AJAX请求以更新服务器上的游戏统计数据 使用WEBrick可以很好地工作,但是现在我已经切换到Apache,如果我对同一条记录进行几次rapid fire更新,那么它们之间似乎写得太多了。例如,如果我有15个ajax调用,它们在大致相同的时间被发送,以更新每个请求的“点数”值5分,那么总分将不会达到75分(我想要的分数),而是在5

在使用FCGI将rails 3.2.8应用程序从WEBrick移动到Apache之后,我遇到了一个问题

该应用程序包括一个用javascript编写的游戏,它发送大量AJAX请求以更新服务器上的游戏统计数据

使用WEBrick可以很好地工作,但是现在我已经切换到Apache,如果我对同一条记录进行几次rapid fire更新,那么它们之间似乎写得太多了。例如,如果我有15个ajax调用,它们在大致相同的时间被发送,以更新每个请求的“点数”值5分,那么总分将不会达到75分(我想要的分数),而是在5到45分之间变化较小的数值

我相信这是因为apache能够同时处理多个请求

我认为正在发生的事情
  • 统计控制器接收到添加点的请求
  • 控制器从数据库中打开统计记录的副本
  • 该模型在当前记录的点数上增加5。
    • 保存记录之前控制器收到另一个添加积分的请求
    • 它将打开仍保存旧积分总数的记录
    • 这比以前的总数增加了5分
  • 第一个请求的记录保存。
    • 第二个请求的记录保存
总分只增加了5分,而不是10分

我试过的 在使用ActiveRecord回调编写过程中,我尝试了各种“锁定”记录的方法,以防止它被打开,但迄今为止没有成功

我尝试过几次网络搜索,但我还没有想出神奇的关键词来给我寻找的答案

问题 有没有办法防止这些请求相互覆盖,或者有没有其他方法可以在服务器上处理这些请求?(我知道我可以将javascript统计编码为在发送另一个请求之前等待或合并请求,但在我看来,服务器应该能够处理尽可能多的请求。)

这完全有可能,我在这里的方法,以及将很高兴为任何建议


谢谢。

我使用了一个与一致的

代码现在如下所示:

  # GET /statistics/request.json
  def request
    # Begin a transaction
    Statistic.transaction do

      stat = Statistic.find(params[:id], lock: true) # Lock the record until we're done with the transaction.

      stat.total_points += 5

      stat.save!

      respond_to do |format|
        format.json { render json: stat }
      end
    end
  end
您还必须确保使用支持锁定的数据库引擎,在我的例子中是运行InnoDB的MySQL

特别感谢这篇文章向我展示了光明: