foundart

foundart

Transactions- what are the basics?

I have a situation similar to create and insert 2 associated models.

In my case User has_many Others and Others belongs_to User.
I want to insert a user and an Other in one transaction.

I’m doing a put_assoc from User and it works fine. It generates 2 insert statements of course.

My question is: Do I need to wrap the insert in a Repo.transaction? I have been unable to find any documentation that talks about how the inserts are handled. If I did not wrap the insert function in a transaction, would the 2 sql statements be batched in a single transaction by default or would they be done as 2 separate transactions?

  MyModule.Repo.transaction fn ->
    MyModule.Repo.insert(changeset)
  end

Most Liked

szsoppa

szsoppa

If anyone coming to this topic needs more tips on Ecto.Multi and transactions in general, we’ve written a post about it: How database transactions work in Ecto and why Elixir makes it awesome? :wink:

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Yes, you can observe this with debug logging:

iex(5)> %Menu.Item{name: "Bar", price: 4.50, category: %Menu.Category{name: "Foo"}} |> Repo.insert!
[debug] QUERY OK db=0.3ms
begin []
[debug] QUERY OK db=6.6ms
INSERT INTO "categories" ("name","inserted_at","updated_at") VALUES ($1,$2,$3) RETURNING "id" ["Foo", {{2017, 11, 3}, {20, 21, 34, 814485}}, {{2017, 11, 3}, {20, 21, 34, 817077}}]
[debug] QUERY OK db=5.0ms
INSERT INTO "items" ("category_id","name","price","inserted_at","updated_at") VALUES ($1,$2,$3,$4,$5) RETURNING "id" [4, "Bar", #Decimal<4.5>, {{2017, 11, 3}, {20, 21, 34, 834005}}, {{2017, 11, 3}, {20, 21, 34, 834009}}]
[debug] QUERY OK db=0.8ms
commit []

Note the begin and commit lines. Those are the beginning and end of the transaction respectively.

theangryangel

theangryangel

You probably want an Ecto.Multi rather than using transactions directly as you get a bunch of extra stuff that you don’t get with Repo.transaction

Where Next?

Popular in Questions Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
mgjohns61585
Could someone help me? I’m making my first elixir program, number guessing game. I can’t figure out how to convert the user’s guess from ...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: The documentation above suggests that while ...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call t...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

Other popular topics Top

malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 42920 311
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52341 488
New
RisingFromAshes
I’ve read in another post that it may be possible with a router helper - but I couldn’t find an appropriate one, and tbh, I’m still just ...
New

We're in Beta

About us Mission Statement