我有多個併發任務,他們都試圖檢查記錄存在,然後,如果不存在,將插入一個。處理併發任務
不幸的是,我最終將重複寫入記錄到DB中,因爲似乎所有任務都決定記錄不會同時存在,那麼所有這些任務都會執行插入操作。
所需的行爲是,我只插入一次,然後,其他任務會識別插入記錄的存在。
這裏是我的嘗試:
alias MyApp.Parent, as: Parent
alias MyApp.Repo, as: Repo
changeset = Parent.changeset(%Parent{}, model)
case Repo.all(from p in Parent, where: p.mobile_number == ^model.mobile_number) do
[] ->
#does not exist
case Repo.insert_or_update(changeset) do
{:ok, %MyApp.Parent{ id: parent_id }} -> parent_id
error_message -> nil
end
[parent_get_by|t] ->
#already exist
%MyApp.Parent{ id: parent_id }= parent_get_by
parent_id
end
任何幫助表示讚賞!
那麼,那麼當我得到一個錯誤,我會閱讀使用'mobile_number'? – simo
如果您想要將現有記錄返回(如果存在),稍後可以執行'Repo.get_by(Parent,mobile_number:model.mobile_number)'。 – Dogbert
如何使用'insert_or_update'?那麼它只會更新它是否存在並返回記錄,是否比使用'get_by'更好地存在現有記錄? – simo