在我们的Rails应用程序中,我们有一个模型Person
,并且mysql数据库中的相应表具有大约一百万条记录。我们在控制器update_status
中有一个针对特定属性status
的方法。我们收到有关此模型的许多更新HTTP请求。本质上,这是高度事务性的,有时我们会在一秒钟之内获得特定记录的多个更新。我们从日志中注意到一些mysql超时。
我的理论是由于特定记录的第二秒内发生了太多更新,导致mysql死锁。作为解决方案,我计划在进行如下更新时使用with_lock:
def update_status
@person_object.with_lock do
@person.update_attribute(:status,params[:status])
end
render response
end
以前我们没有锁,现在我要介绍这个with_lock
来处理此问题。考虑到流量很高,这将带来什么样的性能影响?尽管我知道with_lock
确实row-level locking
会做,但是我不确定是否一定要注意此更改可能引起的其他影响。即使不是由deadlock
引起的,在这样频繁更新的方法/列上使用这样的锁也是一种好习惯。寻找您的输入。谢谢。