rails3 update_all 使用:order, :limit条件时,忽略条件问题

这个bug是在使用delay_job(2.1.2)查出来的,后来google了一下,发现已经有人提交了这个问题

 

delay_job中如果有失败任务的话,后台会一直不停的运行失败任务

源代码修改,加注释的为原来的代码,注释后的为自己添加的修改代码

        # Reserve a single job in a single update query.  This causes workers to serialize on the
        # database and avoids contention.
        def self.reserve(worker, max_run_time = Worker.max_run_time)
#          affected_rows = 0
#          ::ActiveRecord::Base.silence do
#            affected_rows = jobs_available_to_worker(worker.name, max_run_time).limit(1).update_all(["locked_at = ?, locked_by = ?", db_time_now, worker.name])
#          end
#          if affected_rows == 1
#            locked_by_worker(worker.name, max_run_time).first
#          else
#            nil
#          end

#修改代码start
          success = false
          ::ActiveRecord::Base.silence do
            available_job = jobs_available_to_worker(worker.name, max_run_time).first
            success = available_job.update_attributes(:locked_at => db_time_now, :locked_by => worker.name) if available_job
          end          
          if success
            locked_by_worker(worker.name, max_run_time).first
          else
            nil
          end
#修改代码end
        end

 

引起的原因就是,那个update_all了。因为update_all前有limit处理,这样limit前的所有条件就会失效了,这样返回的结果就会始终有一个正在处理的任务。

 

[1]https://rails.lighthouseapp.com/projects/8994/tickets/6058-update_all-ignores-conditions-when-orders-and-limit-options-are-supplied

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值