Transações e Ecto.Multi
Agrupe várias operações de base de dados em unidades atómicas usando transações do Repo e a estrutura componível Ecto.Multi.
Transações e Ecto.Multi é uma aula grátis de Elixir & Phoenix: Scalable Backend Development no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Elixir & Phoenix: Scalable Backend Development, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Elixir & Phoenix: Scalable Backend Development inclui 4 aulas no total.
Partes desta aula ainda não foram traduzidas e aparecem em inglês.
Why Transactions?
A transaction bundles several operations so they all succeed or all roll back together, keeping data consistent.
Repo.transaction with a Function
The simplest form runs a function; if it returns normally the transaction commits, if it raises it rolls back.
Repo.transaction(fn ->
Repo.insert!(%Account{balance: 100})
Repo.insert!(%Log{action: "created"})
end)Manual Rollback
Inside the function you can abort explicitly with Repo.rollback/1, which returns {:error, reason}.
Repo.transaction(fn ->
case withdraw(account, 50) do
{:ok, acc} -> acc
{:error, r} -> Repo.rollback(r)
end
end)The Problem with Nested Functions
Function-based transactions get hard to read and reuse when steps depend on earlier results. Ecto.Multi solves this declaratively.
Building an Ecto.Multi
Ecto.Multi is a struct that accumulates named operations without touching the database until run.
alias Ecto.Multi
multi =
Multi.new()
|> Multi.insert(:user, %User{name: "Ada"})Chaining Operations
Each operation gets a unique name, letting you reference earlier results and inspect them later.
Multi.new()
|> Multi.insert(:user, user_changeset)
|> Multi.insert(:profile, profile_changeset)Depending on Earlier Steps
Pass a function to use the results of previous steps. It receives the repo and a map of completed operations.
Multi.new()
|> Multi.insert(:user, user_changeset)
|> Multi.run(:welcome, fn _repo, %{user: user} ->
send_welcome(user)
end)Running the Multi
Repo.transaction/1 executes the whole Multi atomically and returns {:ok, results} or an error tuple.
case Repo.transaction(multi) do
{:ok, %{user: user}} -> {:ok, user}
{:error, step, reason, _} -> {:error, step, reason}
endPinpointing Failures
On failure the error tuple names exactly which step failed and gives the changes made so far (which were rolled back).
{:error, :profile, changeset, _changes_so_far}Other Multi Operations
Multi supports update, delete, update_all, and delete_all, mirroring Repo functions.
Multi.new()
|> Multi.update(:acc, changeset)
|> Multi.delete_all(:logs, old_logs_query)Composability Wins
Because a Multi is just data, you can build it in pieces across functions and append more steps before running it, improving testability.
def base_multi, do: Multi.new() |> Multi.insert(:user, cs)
# elsewhere
base_multi() |> Multi.insert(:audit, audit_cs) |> Repo.transaction()Quick Check
Test your transaction knowledge.
Recap
You made database changes atomic:
Repo.transactionwith a function commits or rolls back togetherRepo.rollbackaborts explicitlyEcto.Multicomposes named steps as data- Failures return the failing step name and roll back everything
Perguntas Frequentes
A aula “Transações e Ecto.Multi” é grátis?
Sim — o texto completo de “Transações e Ecto.Multi” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Elixir & Phoenix: Scalable Backend Development, atualize para CoddyKit PRO. O curso de Elixir & Phoenix: Scalable Backend Development inclui 4 aulas no total.
O que vou aprender em “Transações e Ecto.Multi”?
Agrupe várias operações de base de dados em unidades atómicas usando transações do Repo e a estrutura componível Ecto.Multi. Você pratica Elixir & Phoenix: Scalable Backend Development com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Elixir & Phoenix: Scalable Backend Development?
Nenhuma experiência prévia é necessária. Elixir & Phoenix: Scalable Backend Development no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Transações e Ecto.Multi”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Elixir & Phoenix: Scalable Backend Development?
Sim. Cada aula de Elixir & Phoenix: Scalable Backend Development inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Esquema do Ecto e Migrações de Banco de Dados
- Repo, Changesets e Consultas
- Associações e Esquemas Incorporados
- Transações e Ecto.Multi