2013-03-22 80 views
1

我发现了这个问题,它与锁无关。 看来,在生产中,我有一份工作:工作永久运行,这被称为我不知道如何!所以这个过程所处理的所有工作都会在其他地方做一些事情! 而在别的地方不是我的数据库,所以我只是杀了它,一切都开始正常工作。红宝石在rails - 延迟作业与不同进程id更新同一列

对不起,浪费你的时间!


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

我有异步更新到同一行,同一列从不同的后台进程。我正在使用delayed_jobs宝石。

我想要做的是:

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不起作用,因为每个延迟的作业都运行在不同的进程中,我想更像是表有一些锁来安全地执行更新。

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

但是,当生产中的代码不起作用。增量数据的丢失仍然存在。

回答

2

使用pessimistic locking

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

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

+0

对不起,忘了说我正在使用rails 2.3.8,那里没有with_lock。 – 2013-03-22 11:10:21

+0

但锁定!仍然可用。只需从我链接的文档页面复制实施,您就可以轻松前往。 – 2013-03-22 11:56:55

+0

已经试过 – 2013-03-22 12:16:54