Transaksi dan Ecto.Multi
Kelompokkan beberapa operasi basis data menjadi unit atomik menggunakan transaksi Repo dan struct Ecto.Multi yang dapat dikomposisikan.
Transaksi dan Ecto.Multi adalah pelajaran Elixir & Phoenix: Scalable Backend Development gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Elixir & Phoenix: Scalable Backend Development, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Elixir & Phoenix: Scalable Backend Development mencakup 4 pelajaran total.
Bagian dari pelajaran ini belum diterjemahkan dan ditampilkan dalam bahasa Inggris.
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
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Transaksi dan Ecto.Multi” gratis?
Ya — teks lengkap “Transaksi dan Ecto.Multi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Elixir & Phoenix: Scalable Backend Development, upgrade ke CoddyKit PRO. Kursus Elixir & Phoenix: Scalable Backend Development mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Transaksi dan Ecto.Multi”?
Kelompokkan beberapa operasi basis data menjadi unit atomik menggunakan transaksi Repo dan struct Ecto.Multi yang dapat dikomposisikan. Kamu berlatih Elixir & Phoenix: Scalable Backend Development dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Elixir & Phoenix: Scalable Backend Development?
Tidak diperlukan pengalaman sebelumnya. Elixir & Phoenix: Scalable Backend Development di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Transaksi dan Ecto.Multi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Elixir & Phoenix: Scalable Backend Development ini?
Ya. Setiap pelajaran Elixir & Phoenix: Scalable Backend Development menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Skema Ecto dan Migrasi Basis Data
- Repo, Changeset, dan Kueri
- Asosiasi dan Skema Tersemat
- Transaksi dan Ecto.Multi