Ecto - 如何异步更新一个 table 相对于另一个 table 的一批记录

Ecto - how to asynchronously update a batch of records from one table with respect to another table

我有两个表:assignmentsreports。制作一份报告以保留分配的统计信息。因此,每次创建或更新任务时,都必须不加区别地更新所有报告。我这样做:

Multi.new()
|> Multi.insert(:assignment, assignment_changeset(params))
|> Multi.update(:update_reports, update_all_reports())

现在,每当我创建或更新作业时,这都会对服务器造成巨大的损失,因为要更新的报告太多了。因此我遇到了超时,所以我暂时禁用了报告更新。现在,我想知道是否有更好的方法可以在不中断分配操作的情况下批量更新报告。

我相信您有充分的理由更新所有报告,即使我认为由于服务器负载而应该修改实施。 我给你的解决方案只解决你所说的超时问题。

您可以将所有内容包装在一个 spawn 中:

spawn(fn -> 
  Multi.new()
  |> Multi.insert(:assignment, assignment_changeset(params))
  |> Multi.update(:update_reports, update_all_reports())
end)

它将创建另一个进程,create/update 将在该进程上发生,让请求进程自由地继续其进程。 请记住,只有在您不需要操作结果时才有效,否则您应该考虑使用回调来获取结果。