Ruby on rails RubyonRails-具有不同进程id的延迟作业更新同一列

Ruby on rails RubyonRails-具有不同进程id的延迟作业更新同一列,ruby-on-rails,sql-update,multiprocess,Ruby On Rails,Sql Update,Multiprocess,我发现了问题,与锁无关。 似乎在生产中,我有一份工作:永久运行的工作,这就是所谓的我不知道怎么做!因此,该流程处理的所有作业都将在其他地方执行! 其他地方不是我的数据库,所以我刚把它关掉,一切都开始正常工作了 对不起,浪费了你的时间 抱歉,忘了告诉我我正在使用rails 2.3.8 我从不同的后台进程对同一行、同一列进行异步更新。我用的是延迟就业宝石 我想做的是: ActiveRecord::Base.connection.execute( "Update table_name set col

我发现了问题,与锁无关。 似乎在生产中,我有一份工作:永久运行的工作,这就是所谓的我不知道怎么做!因此,该流程处理的所有作业都将在其他地方执行! 其他地方不是我的数据库,所以我刚把它关掉,一切都开始正常工作了

对不起,浪费了你的时间


抱歉,忘了告诉我我正在使用rails 2.3.8

我从不同的后台进程对同一行、同一列进行异步更新。我用的是延迟就业宝石

我想做的是:

ActiveRecord::Base.connection.execute(
"Update table_name set column = column + #{updated_number}
where id = #{self.id}").
我的数据库是mysql,我写的表是InnoDB

所以问题是,在不同的延迟作业中运行该查询将导致一些数据增量丢失。请注意(column=column+#{updated_number})我想增加表上的当前值

使用rails锁不起作用,因为每个延迟的作业都在不同的进程中运行,我的想法更像是如果表有一些锁来安全地进行更新

还有一件事,用锁!,在我的开发代码中,我运行了3次rake jobs:work,然后在delayed_job表上确认3个不同的进程锁定了3个作业,并且是开发代码,它工作得很好

但当把代码投入生产时,它就不起作用了。增量数据的丢失仍然存在。

使用:


这将确保通过DB同步更新。

抱歉,我忘了告诉您我正在使用rails 2.3.8,with_锁在那里不可用。但是锁!仍然可以使用。只需从我链接的文档页面复制实现即可。
your_object.with_lock do
  your_object.column += updated_number
  your_object.save!
end