问题
在使用FCGI将rails 3.2.8应用程序从WEBrick转移到Apache时,我遇到了一个问题。
该应用程序包括一个用javascript编写的游戏,它发送大量AJAX请求,以便更新服务器上的游戏统计信息。
使用WEBrick可以很好地工作,但是现在我已经切换到Apache,如果我对相同的记录进行了几次快速更新,这些更新似乎是在编写另一条记录。例如,如果我有15个ajax调用,它们几乎同时被发送到更新每个请求5分的“积分”值,那么总分将不会加到75,这是我想要的,而是一些在5到45之间的变化较低的数字。
我相信这是因为apache能够同时处理多个请求。
我认为正在发生的事情
点数总数只增加5,而不是10。
我试过的
我尝试过各种“锁定”记录的方法,以防止在使用ActiveRecord回调编写过程中打开它,但到目前为止没有成功。
我已经尝试过几个网络搜索,但我还没有想出神奇的关键字给我的答案,我正在寻找。
问题
是否有办法防止这些请求相互覆盖,或者是否有其他方法可以在服务器上处理这些请求?(我知道我可以将javascript统计数据编码为在发送另一个请求之前等待或合并请求,但在我看来,服务器应该能够处理尽可能多的请求。)
这是完全有可能的,我在这里的方法是完全不同的,并将很高兴听到任何建议。
谢谢。
发布于 2012-11-13 17:11:29
我成功地使用了事务块和悲观锁定协同工作。
代码现在如下所示:
# 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?
https://stackoverflow.com/questions/13352198
复制相似问题