Transaksi dan Ecto.Multi
Kumpulkan beberapa operasi pangkalan data menjadi unit atom menggunakan transaksi Repo dan struktur Ecto.Multi yang boleh digubah.
Transaksi dan Ecto.Multi ialah pelajaran Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala merangkumi sejumlah 4 pelajaran.
Mengapa Transaksi?
Satu transaksi menggabungkan beberapa operasi supaya semuanya berjaya atau semuanya dibatalkan bersama-sama, sekali gus mengekalkan ketekalan data.
Repo.transaction dengan Fungsi
Bentuk paling ringkas menjalankan fungsi; jika fungsi itu dipulangkan seperti biasa, transaksi dilakukan, manakala jika ia mencetuskan pengecualian, transaksi dibatalkan.
Repo.transaction(fn ->
Repo.insert!(%Account{balance: 100})
Repo.insert!(%Log{action: "created"})
end)Pembatalan Manual
Di dalam fungsi, Anda boleh membatalkannya secara jelas dengan Repo.rollback/1, yang memulangkan {:error, reason}.
Repo.transaction(fn ->
case withdraw(account, 50) do
{:ok, acc} -> acc
{:error, r} -> Repo.rollback(r)
end
end)Masalah dengan Fungsi Bersarang
Transaksi berasaskan fungsi sukar dibaca dan digunakan semula apabila langkah-langkah bergantung pada hasil terdahulu. Ecto.Multi menyelesaikannya secara deklaratif.
Membina Ecto.Multi
Ecto.Multi ialah struktur yang mengumpulkan operasi bernama tanpa menyentuh pangkalan data sehingga run dijalankan.
alias Ecto.Multi
multi =
Multi.new()
|> Multi.insert(:user, %User{name: "Ada"})Merangkaikan Operasi
Setiap operasi mendapat nama unik, yang membolehkan Anda merujuk hasil terdahulu dan memeriksanya kemudian.
Multi.new()
|> Multi.insert(:user, user_changeset)
|> Multi.insert(:profile, profile_changeset)Bergantung pada Langkah Terdahulu
Hantar fungsi untuk menggunakan hasil langkah-langkah terdahulu. Fungsi itu menerima repositori dan peta operasi yang telah selesai.
Multi.new()
|> Multi.insert(:user, user_changeset)
|> Multi.run(:welcome, fn _repo, %{user: user} ->
send_welcome(user)
end)Menjalankan Multi
Repo.transaction/1 melaksanakan keseluruhan Multi secara atomik dan memulangkan {:ok, results} atau tuple ralat.
case Repo.transaction(multi) do
{:ok, %{user: user}} -> {:ok, user}
{:error, step, reason, _} -> {:error, step, reason}
endMengenal Pasti Kegagalan
Apabila berlaku kegagalan, tuple ralat menamakan langkah yang gagal dengan tepat dan memberikan perubahan yang dibuat setakat itu (yang telah dibatalkan).
{:error, :profile, changeset, _changes_so_far}Operasi Multi Lain
Multi menyokong update, delete, update_all dan delete_all, yang mencerminkan fungsi Repo.
Multi.new()
|> Multi.update(:acc, changeset)
|> Multi.delete_all(:logs, old_logs_query)Kelebihan Kebolehkomposisian
Oleh sebab Multi hanyalah data, Anda boleh membinanya secara berperingkat merentas fungsi dan menambahkan lebih banyak langkah sebelum menjalankannya, sekali gus memudahkan pengujian.
def base_multi, do: Multi.new() |> Multi.insert(:user, cs)
# elsewhere
base_multi() |> Multi.insert(:audit, audit_cs) |> Repo.transaction()Semakan Pantas
Uji pengetahuan Anda tentang transaksi.
Imbas Kembali
Anda menjadikan perubahan pangkalan data atomik:
Repo.transactiondengan fungsi sama ada melakukan atau membatalkan semuanya bersama-samaRepo.rollbackmembatalkan operasi secara jelasEcto.Multimenggabungkan langkah bernama sebagai data- Kegagalan memulangkan nama langkah yang gagal dan membatalkan segala-galanya
Pelajari Elixir dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Transaksi dan Ecto.Multi” percuma?
Ya — teks penuh “Transaksi dan Ecto.Multi” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala, tingkat taraf kepada CoddyKit PRO. Kursus Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Transaksi dan Ecto.Multi”?
Kumpulkan beberapa operasi pangkalan data menjadi unit atom menggunakan transaksi Repo dan struktur Ecto.Multi yang boleh digubah. Anda berlatih Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Transaksi dan Ecto.Multi” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala ini?
Ya. Setiap pelajaran Elixir & Phoenix: Pembangunan Bahagian Belakang Boleh Skala menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Skema Ecto dan Migrasi Pangkalan Data
- Repo, Set Perubahan dan Pertanyaan
- Perkaitan dan Skema Terbenam
- Transaksi dan Ecto.Multi