首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails3& activerecord:我需要采取特殊的记录锁定预防措施来更新计数器字段吗?

Rails3& activerecord:我需要采取特殊的记录锁定预防措施来更新计数器字段吗?
EN

Stack Overflow用户
提问于 2011-06-11 11:18:21
回答 1查看 859关注 0票数 2

每次显示用户配置文件时,我们都会更新Users表中的整数计数器。

我开始思考高并发的情况,并想知道如果一群人同时访问用户的个人资料页面会发生什么: rails/activerecord会神奇地为我处理记录锁定和信号量之类的事情吗?

或者,当对我的update方法进行并发调用时,我的应用程序是否需要显式调用某种机制,以避免错过更新事件?

代码语言:javascript
复制
def profile_was_hit
  self.update_attributes :hitcounter =>  self.hitcount + 1
end

沿着这些思路,我应该在什么时候使用Users.increment_counter(:hit counter,self.id)之类的东西呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-11 11:36:05

在默认配置中,单个Rails实例一次只能处理一个请求,因此您不必担心应用程序层上的任何并发问题。

如果您的应用程序有多个实例正在运行(您可能会这样做/将会这样做),它们都会向数据库发出请求,而不会彼此谈论它。这就是为什么这是在数据库层处理的原因。MySQL、PostgreSQL等都将在写入时锁定行。

处理这种情况的方式对于性能来说并不理想,因为您的应用程序正在读取值,递增它,然后写入它。读取和写入之间的延迟确实允许您遗漏数值。您可以通过将增量责任推送到您的数据库(UPDATE hitcounter SET hitcount = hitcount + 1;)来避免这种情况。我相信ActiveRecord已经内置了对此的支持,不过我/你必须去寻找它。更新:哦,是的,你想使用increment_counter方法来做这件事。Reference/Documentation

一旦你更新了你的进程,将增量责任推给数据库,我暂时不会担心性能问题。我曾经有一个PHP应用程序为每个请求做一次,它为我扩展到100+更新/秒(mysqld在同一台机器上,没有持久连接,并且总是< 10%的cpu)。

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

https://stackoverflow.com/questions/6313843

复制
相关文章

相似问题

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