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

tim*_*one 5 ruby-on-rails sidekiq

我有一个在 after_save 中启动的 Sidekiq 作业,它似乎获取了错误的数据,我很好奇这是否是我应该期待的行为。这项工作的目标基本上是构建对象的缓存版本。

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

在 after_save 中,我有:

after_save
   ItemWorker.peform_async
end
Run Code Online (Sandbox Code Playgroud)

在我的工人中,我有:

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

在我的 after_save 开始时,我的所有更改都应该已经在数据库中并提交了 - Postgres 有什么方法可以在此时锁定该行(我使用的是 Postgres 9.4)?

有没有办法让我检查它是否已保存或者我应该将其移动到 after_commit (或其他地方)?

Mat*_*son 2

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

正如Sidekiq 常见问题解答中所解释的,最佳实践是使用after_commit

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