我有一个在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(或其他地方)?
答案 0 :(得分:1)
在将新的/更改的数据提交到数据库之前,Sidekiq很可能会运行该工作程序,这意味着工作人员将看到错误的数据。
正如Sidekiq FAQ中所述,最佳做法是使用after_commit
:
Sidekiq正在尝试在事务实际提交之前执行您的工作。使用Rails的
after_commit :on => :create
挂钩或将事务创建移到事务块之外。