在Rails after_save回调中,提交是否已完成,并且Sidekiq作业可以访问更改

时间:2016-06-28 21:59:13

标签: ruby-on-rails sidekiq

我有一个在after_save中启动的Sidekiq作业,看起来好像收到了错误的数据,我很好奇这是否是我应该期待的行为。这个工作的目标基本上是构建对象的缓存版本。

我有一个可以将is_enabled设置为true / false的项目。

在after_save中,我有:

after_save
   ItemWorker.peform_async
end

在我的工作人员中,我有:

  def perform item_id
    mi=Item.find(item_id)
    Queryable.manage_object mi # <-- will build our cached objects here
  end

在我的after_save开始时,如果我的所有更改都已经存在于数据库中并且已提交 - 那么Postgres是否可以在此时锁定行(我在Postgres 9.4上)?

我有办法检查它是否已保存,还是应该将其移至after_commit(或其他地方)?

1 个答案:

答案 0 :(得分:1)

在将新的/更改的数据提交到数据库之前,Sidekiq很可能会运行该工作程序,这意味着工作人员将看到错误的数据。

正如Sidekiq FAQ中所述,最佳做法是使用after_commit

  

Sidekiq正在尝试在事务实际提交之前执行您的工作。使用Rails的after_commit :on => :create挂钩或将事务创建移到事务块之外。