All examples I’ve seen so far wrap Ecto.Multi in transaction to execute - is it possible to run it outside of transaction? That is to use something else (not Repo.transaction) to execute it?
I find error handling provided by Ecto.Multi to be useful but don’t need to rollback previous changes in case further operations fail.
update record status to completed in case API call succeeds
If not wrapping operations in transaction everything would be okay but with transaction everything rollbacks and I don’t have any records in users table (I’d like to have the record with pending status to be persisted).
Why not just use regular queries and functions here then? If you do not want transaction semantics (e.g., rollback on failure), do not use a transaction.
As I mentioned error handling provided by Ecto.Multi looks very nice - without it I would have to type lots of case statements to check on each operation result.
Moreover I use Ecto.Multi in similar situations and it fits nicely but in this particular case using transaction is not desirable.
I really like Ecto.Multi for composability purposes outside of its intended use case. I think there might be some momentum in the community around this as I’ve heard someone is working on pulling Multi out of Ecto and making it more generic.
I agree with @hubertlepicki. The with syntax is a good alternative. I just went through our code base and replaced a bunch of Ecto.Multi’s with with statements. I’ve recently been down this road and I think using with statements is a good approach.
My codebase is a mix of Multi Transactions and With statements. It sounds like @tap349 use case is better suited for with. Multi is coupled with database transactions. The API call breaks that pattern. Multi is better with: