首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails中的快速消防AJAX请求导致Apache上的数据覆盖。

Rails中的快速消防AJAX请求导致Apache上的数据覆盖。
EN

Stack Overflow用户
提问于 2012-11-12 21:53:21
回答 1查看 135关注 0票数 0

问题

在使用FCGI将rails 3.2.8应用程序从WEBrick转移到Apache时,我遇到了一个问题。

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

使用WEBrick可以很好地工作,但是现在我已经切换到Apache,如果我对相同的记录进行了几次快速更新,这些更新似乎是在编写另一条记录。例如,如果我有15个ajax调用,它们几乎同时被发送到更新每个请求5分的“积分”值,那么总分将不会加到75,这是我想要的,而是一些在5到45之间的变化较低的数字。

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

我认为正在发生的事情

  • StatisticsController收到添加点数的请求。
  • 控制器从数据库中打开统计记录的副本。
  • 该模型为当前记录的点数增加了5个。
    • 在保存记录之前,控制器会收到另一个添加点数的请求。
    • 它打开的纪录,仍然保持旧的积分总数。
    • 它使旧的总数增加了5分。

  • 第一个请求的记录保存。
    • 第二个请求的记录保存。

点数总数只增加5,而不是10。

我试过的

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

我已经尝试过几个网络搜索,但我还没有想出神奇的关键字给我的答案,我正在寻找。

问题

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

这是完全有可能的,我在这里的方法是完全不同的,并将很高兴听到任何建议。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-13 17:11:29

我成功地使用了事务块悲观锁定协同工作。

代码现在如下所示:

代码语言: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

您还必须确保使用支持锁定的数据库引擎,在我的示例中是运行MySQL的InnoDB。

特别感谢这篇文章为我展示了光明:悲观锁定似乎不适用于mysql?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13352198

复制
相关文章

相似问题

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