Transaktiot ja Ecto.Multi
Ryhmittele useita tietokantaoperaatioita atomisiksi kokonaisuuksiksi Repo-transaktioiden ja yhdisteltävän Ecto.Multi-rakenteen avulla.
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}
endVirheiden 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.transactionvahvistaa muutokset yhdessä tai peruu ne yhdessä Repo.rollbackkeskeyttää suorituksen eksplisiittisestiEcto.Multikoostaa nimetyt vaiheet dataksi- Virheissä palautetaan epäonnistuneen vaiheen nimi ja kaikki muutokset perutaan
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
- Ecto-skeemat ja tietokantasiirrot
- Repo, Changesets ja kyselyt
- Assosiaatiot ja upotetut skeemat
- Transaktiot ja Ecto.Multi