1

我发现了这个问题,它与锁无关。似乎在生产中,我有一个工作:工作永久运行,这被称为我不知道如何!因此,该进程处理的所有作业都会在其他地方做某事!而且其他地方不是我的数据库,所以我只是将其杀死,一切都开始正常工作。

对不起,浪费你的时间!!


对不起,忘了告诉我正在使用 rails 2.3.8!

我对来自不同后台进程的同一行、同一列进行了异步更新。我正在使用delayed_jobs gem。

我想做的是:

ActiveRecord::Base.connection.execute(
"Update table_name set column = column + #{updated_number}
where id = #{self.id}").

我的数据库是mysql,我写的表是InnoDB。

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

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

还有一件事,使用锁!,在我的开发代码中,我运行了 3 次 rake 作业:工作,然后我在 delay_job 表上确认 3 个不同的进程锁定了 3 个作业,并且它是完美运行的开发代码。

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

4

1 回答 1

2

使用悲观锁定

your_object.with_lock do
  your_object.column += updated_number
  your_object.save!
end

这将确保更新通过数据库同步。

于 2013-03-22T10:35:07.867 回答