我有多个并发任务,他们都试图检查记录存在,然后,如果不存在,将插入一个。处理并发任务
不幸的是,我最终将重复写入记录到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