我正在努力在Ecto.Multi
中的一个步骤中执行异步操作。在这里,我只提供最小版本来描述我的问题:
defmodule MyModule do
do my_function(repo \\ Repo) do
Ecto.Multi.new()
|> Ecto.Multi.run(:example, &perform_example(&1, repo))
|> repo.transaction()
end
def perform_example(_changes_so_far, repo) do
Task.async(fn -> repo.all(DataModule) end)
|> IO.inspect() # 1.
|> Task.await() # 2.
|> IO.inspect()
end
end
MyModule.my_function(Repo)
1。似乎正常工作,因为它Task
结构:
%Task{owner: #PID<0.352.0>, pid: #PID<0.354.0>,
ref: #Reference<0.2903625078.3861118978.56327>}
2。很遗憾引发错误:
** (EXIT from #PID<0.352.0>) exited in: GenServer.call(#PID<0.353.0>, {:checkout, #Reference<0.2903625078.3861118978.56400>, true, 15000}, 5000)
** (EXIT) time out
奇怪的是,我尝试在 我尝试使用相关功能来运用此代码,这似乎正常工作。在测试环境中执行时,这只是Multi
之外执行相同的代码并且它工作正常......这个问题是Multi
如何工作的问题吗? / p>
Multi
步骤中的一个问题。
答案 0 :(得分:1)
Ecto不支持使用单个事务的多个进程。目前尚不清楚这种设置的语义是什么,以及如果其中一个进程失败会发生什么。