apr
Hello!
I had a question regarding the usage of Multi.run/3. I am using pg as my database. Let’s say I have a Multi with a couple different updates to my db. At the very end, I want to run a custom function that does not update the db (so no Repo.insert etc. It updates an ets table) using Multi.run/3.
My question is, does it make sense to use Multi.run/3 to run functions that do not update the db? I would like to do this because my custom function can return {:error, value} and all the preceding updates can be rolled back.
Thanks!
Trending in Questions
Hello!
Suppose you are building workflow (order / task / payment) processing system with the following requirements:
Each workflow con...
New
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app?
Looking for hints regarding:
Addi...
New
Kia ora,
We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
Hi all, I wanted to ask how the community is dealing with post-release steps.
Today we have Ecto migrations, which make sure that the db...
New
Hello,
I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New
Other Trending Topics
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex











Showing Posts 1 to 5- Show Best Posts
- Show All Posts (oldest first)
- Show All Posts (newest first)
OvermindDL1
You use Multi.run for something not DB oriented but where you still want the DB to rollback if it fails, so yes, this is the use-case it is for.
Just remember that an entire Multi pipeline is in a transaction, so the rows it accessed in the database are locked until it’s complete, so make sure it doesn’t take too long to run.
apr
Gotcha! Thanks a lot @OvermindDL1!
Edit: I was also wondering, if you use a Multi.run to actually update the DB, does the update get rolled back when some other operation down the line fails? If so, how does Ecto figure out which Multi runs update the DB and which ones don’t (In order to rollback any updates on failure)?
benwilson512
@apr Ecto itself doesn’t “undo” the operations, rather it opens a transaction and then all operations within that transaction will be rolled back by the database unless the transaction is committed.
apr
Cool. I understand now. Thanks Ben!
medikent
In order for an operation in a Multi.run block to be included in the transaction must the run block use the Repo argument passed from the earlier Multi step or can it call a function that makes arbitrary Repo calls while not using the repo passed in from the Multi? This could be such as calling Repo.one, Repo.insert, or something like that