Elixir ja Phoenix: skaalautuva backend-kehitys · Oppitunti

Transaktiot ja Ecto.Multi

Ryhmittele useita tietokantaoperaatioita atomisiksi kokonaisuuksiksi Repo-transaktioiden ja yhdisteltävän Ecto.Multi-rakenteen avulla.

Oppitunti 4/413 vaihetta

Transaktiot ja Ecto.Multi on ilmainen Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Elixir ja Phoenix: skaalautuva backend-kehitys-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Elixir ja Phoenix: skaalautuva backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Miksi transaktioita tarvitaan?

Transaktio kokoaa useita toimintoja niin, että ne joko onnistuvat kaikki tai perutaan kaikki yhdessä, jolloin tiedot pysyvät yhdenmukaisina.

Repo.transaction funktiolla

Yksinkertaisin muoto suorittaa funktion. Jos se palautuu normaalisti, transaktio vahvistetaan; jos se aiheuttaa poikkeuksen, transaktio perutaan.

Repo.transaction(fn ->
  Repo.insert!(%Account{balance: 100})
  Repo.insert!(%Log{action: "created"})
end)

Manuaalinen peruutus

Funktion sisällä voitte keskeyttää suorituksen eksplisiittisesti Repo.rollback/1-funktion avulla, joka palauttaa arvon {:error, reason}.

Repo.transaction(fn ->
  case withdraw(account, 50) do
    {:ok, acc} -> acc
    {:error, r} -> Repo.rollback(r)
  end
end)

Sisäkkäisten funktioiden ongelma

Funktioihin perustuvia transaktioita on vaikea lukea ja käyttää uudelleen, kun vaiheet riippuvat aiemmista tuloksista. Ecto.Multi ratkaisee tämän deklaratiivisesti.

Ecto.Multin rakentaminen

Ecto.Multi on rakenne, joka kerää nimettyjä toimintoja koskematta tietokantaan ennen suorittamista.

alias Ecto.Multi
multi =
  Multi.new()
  |> Multi.insert(:user, %User{name: "Ada"})

Toimintojen ketjuttaminen

Jokainen toiminto saa yksilöllisen nimen, jonka avulla voitte viitata aiempiin tuloksiin ja tarkastella niitä myöhemmin.

Multi.new()
|> Multi.insert(:user, user_changeset)
|> Multi.insert(:profile, profile_changeset)

Riippuvuus aiemmista vaiheista

Välittäkää funktio, joka käyttää aiempien vaiheiden tuloksia. Se saa argumenteikseen repon ja valmiiksi suoritettujen toimintojen mapin.

Multi.new()
|> Multi.insert(:user, user_changeset)
|> Multi.run(:welcome, fn _repo, %{user: user} ->
  send_welcome(user)
end)

Multin suorittaminen

Repo.transaction/1 suorittaa koko Multin atomisesti ja palauttaa arvon {:ok, results} tai virhetupleen.

case Repo.transaction(multi) do
  {:ok, %{user: user}} -> {:ok, user}
  {:error, step, reason, _} -> {:error, step, reason}
end

Virheiden paikantaminen

Virheen sattuessa virhetuple kertoo tarkasti, mikä vaihe epäonnistui, ja sisältää siihen asti tehdyt muutokset, jotka peruttiin.

{:error, :profile, changeset, _changes_so_far}

Muut Multi-toiminnot

Multi tukee toimintoja update, delete, update_all ja delete_all, jotka vastaavat Repo-funktioita.

Multi.new()
|> Multi.update(:acc, changeset)
|> Multi.delete_all(:logs, old_logs_query)

Koostettavuuden hyödyt

Koska Multi on vain dataa, voitte rakentaa sen osissa eri funktioissa ja lisätä siihen vaiheita ennen suorittamista, mikä helpottaa testaamista.

def base_multi, do: Multi.new() |> Multi.insert(:user, cs)
# elsewhere
base_multi() |> Multi.insert(:audit, audit_cs) |> Repo.transaction()

Pikatarkistus

Testatkaa transaktioita koskevat tietonne.

Kertaus

Teitte tietokantamuutoksista atomisia:

  • Funktiolla käytettävä Repo.transaction vahvistaa muutokset yhdessä tai peruu ne yhdessä
  • Repo.rollback keskeyttää suorituksen eksplisiittisesti
  • Ecto.Multi koostaa nimetyt vaiheet dataksi
  • Virheissä palautetaan epäonnistuneen vaiheen nimi ja kaikki muutokset perutaan
Aloita maksutta

Opi Elixir tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Transaktiot ja Ecto.Multi” ilmainen?

Kyllä – oppitunnin ”Transaktiot ja Ecto.Multi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Elixir ja Phoenix: skaalautuva backend-kehitys-kurssin, päivitä CoddyKit PROhon. Elixir ja Phoenix: skaalautuva backend-kehitys-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Transaktiot ja Ecto.Multi”?

Ryhmittele useita tietokantaoperaatioita atomisiksi kokonaisuuksiksi Repo-transaktioiden ja yhdisteltävän Ecto.Multi-rakenteen avulla. Harjoittelet Elixir ja Phoenix: skaalautuva backend-kehitys-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Elixir ja Phoenix: skaalautuva backend-kehitys-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Elixir ja Phoenix: skaalautuva backend-kehitys-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Transaktiot ja Ecto.Multi”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunnilla?

Kyllä. Jokainen Elixir ja Phoenix: skaalautuva backend-kehitys-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ecto-skeemat ja tietokantasiirrot
  2. Repo, Changesets ja kyselyt
  3. Assosiaatiot ja upotetut skeemat
  4. Transaktiot ja Ecto.Multi
← Takaisin: Elixir ja Phoenix: skaalautuva backend-kehitys