我发现了这个问题,它与锁无关。似乎在生产中,我有一个工作:工作永久运行,这被称为我不知道如何!因此,该进程处理的所有作业都会在其他地方做某事!而且其他地方不是我的数据库,所以我只是将其杀死,一切都开始正常工作。
对不起,浪费你的时间!!
对不起,忘了告诉我正在使用 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 个作业,并且它是完美运行的开发代码。
但是,当将该代码投入生产时,它就不起作用了。增量数据的丢失仍然存在。