rails 3&activerecord:我是否需要采取特殊记录锁定预防措施来更新计数器字段?

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

我开始考虑高并发情况,并想知道如果一群人在同一时间点击用户的个人资料页面会发生什么:rails / activerecord是否神奇地为我处理记录锁定和信号量?

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

def profile_was_hit self.update_attributes :hitcounter => self.hitcount + 1 end 

沿着这些方向,我什么时候应该使用像Users.increment_counter(:hit counter,self.id)这样的东西?

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

如果您的应用程序的多个实例正在运行(您可能会/将要执行),它们将向数据库发出请求,而无需相互通信。 这就是在数据库层处理的原因。 MySQL,PostgreSQL等都将在写入时锁定行。

处理这种情况的方式对于性能来说并不理想,因为您的应用程序正在读取值,递增它,然后编写它。 读取和写入之间的延迟确实允许您错过值。 您可以通过将增量责任推送到数据库来避免这种情况( UPDATE hitcounter SET hitcount = hitcount + 1; )。 我相信ActiveRecord支持这个内置,我/你将不得不去挖掘它。 更新:哦,是的,是的,你想使用increment_counter方法来做到这一点。 参考/文件 。

一旦您更新了流程,将增量责任推送到数据库,我就不用担心性能会有一段时间了。 我曾经有一个PHP应用程序每次请求执行此操作,它为我提供了100多次更新/秒(同一台机器上的mysqld,没有持久连接,总是<10%cpu)。