我正在开发一个应用程序,其中一个模块访问日志(ActiveRecord 模型)以在执行的多个点增加各种值。问题在于该脚本可能需要几秒钟的时间,并且同一脚本的其他实例可能会同时运行。
我看到的是,虽然脚本正确完成并且所有数据都被考虑在内,但这些值从来都不正确。这可能是因为当脚本到达更新值的位置时,该列的读取值(递增)已经过时。
如果我强制它一次只有一个模块实例,那么这些值是正确的,但出于性能原因,我不能继续这样做。
目前,我尝试通过在事务中的每个增量语句之前查询数据库中的记录来解决该问题,如下所示,其中 column
是列的符号,值
为1或更高:
Log.transaction do
log = Log.find(@log_id)
log.update_attribute(column, log.send(column) + value)
end
但是,它仍然无法给我准确的数字。我认为涉及缓存,我想我可以尝试类似的方法:
Log.transaction do
uncached do
log = Log.find(@log_id)
log.update_attribute(column, log.send(column) + value)
end
end
但我肯定不是第一个遇到这个问题的人,所以我想知道是否有更好的实现/解决方案来解决我的问题?
最佳答案
ActiveRecord 提供 update_counters方法。您可以按如下方式更改代码:
Log.update_counters @log_id, column.to_sym => value
关于ruby-on-rails - 在 Rails 中更新/增加值时的数据完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377153/