ruby-on-rails - 在 Rails 中更新/增加值时的数据完整性

标签 ruby-on-rails ruby database activerecord

我正在开发一个应用程序,其中一个模块访问日志(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/

相关文章:

java - MyBatis 执行获取并基于返回值在 Xxxmapper.xml 中执行更新/插入?

ruby-on-rails - 为 Ruby 类动态定义 Object#initialize

ruby-on-rails - Assets 管道中不存在 Assets "logo.png"

ruby-on-rails - 如何在我的规范中使用 Timecop 正确地卡住时间?

ruby-on-rails - SIT in rails 不适用于 audited-activerecord

ruby - 在数组的数组上使用 Enumerable#zip

ruby-on-rails - 使用 rails 显示来自数据库的信息不起作用

ruby-on-rails - Resque 和 New 遗物

java - 使用 Ruby 生成 Java 项目

database - Oracle:删除子表时删除父表(双向级联删除)