ckhrysze

ckhrysze

I’ve read in several places that try/rescue are to be generally avoided. However, I see no way around it in the following scenario (unless I’m just really missing something or discovered a bug, which I’m kinda hoping for…).

c is an invalid changeset

iex(4)> Repo.insert(c, [])
{:error, ...}
iex(5)> Repo.transaction(fn -> Repo.insert(c, []) end)
{:ok,
  {:error,
    ...}}
iex(6)> Repo.transaction(fn -> {:ok, _} = Repo.insert(c, []) end)
** (MatchError) no match of right hand side value: {:error, ...}

Ideally there will be additional things in the transaction…but they are based on the inserted records value…I don’t want to wrap everything in a transaction with a try/rescue as well, but I’m not sure how to avoid it.

Also, I’ve glanced at, but don’t quite understand, ecto multi; though I’m not sure that helps if the second db action relies on data from the first.

Marked As Solved

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

It all just depends on what you’re trying to do. Because I’m not entirely sure what you’re trying to do, here are a few patterns you may find useful.

Try to insert inside a transaction, if it fails, do something else, but let the transaction succeed

Repo.transaction(fn ->
  case Repo.insert(changeset) do
    {:ok, record} -> handle_success(record)
    _ -> do_something_else()
  end
end)

Try to insert something, if it succeeds insert something else, and rollback everything if there’s a failure:

Repo.transaction(fn ->
  with {:ok, record} <- Repo.insert(foo),
    {:ok, other_record} <- Repo.insert(bar) do
      {record, other_record}
  else
    val -> Repo.rollback(val)
  end
end)
|> case do
  {:ok, {foo, bar}} ->
    IO.puts "Both foo and bar were created because the transaction succeedd"
  {:error, error} ->
    IO.puts "Neither foo nor bar were created because the transaction failed with error: #{inspect error}"
end

Also Liked

wojtekmach

wojtekmach

Hex Core Team

Also, if you want to use Multi, Ecto.Multi.merge can be used to access data from previous operations.

EDIT: actually, using Ecto.Multi.run might be easier too.

ckhrysze

ckhrysze OP

Thank you! I had tried to solve it with ‘with’, but I must have made another mistake in the process. Also, thank you @wojtekmach, I’ll look into multi.merge.

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews