Go Academy · Oppitunti

Transaktiot

Vahvista ja peruuta

Oppitunti 4/413 vaihetta

Transaktiot on ilmainen Go Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Go Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Go Academy-kurssilla on yhteensä 4 oppituntia.

Miksi transaktioita käytetään

Transaktio ryhmittelee useita lauseita niin, että kaikki onnistuvat tai kaikki epäonnistuvat yhdessä. Näin tiedot pysyvät yhdenmukaisina, esimerkiksi kun rahaa siirretään kahden tilin välillä ilman, että se katoaa kesken siirron.

  • Atominen: kaikki tai ei mitään
  • Yhdenmukainen tila
  • Eristetty muista transaktioista

db.Begin

Begin aloittaa transaktion ja palauttaa *sql.Tx-olion. Suoritatte lauseet Tx:llä, ette poolilla, jotta ne käyttävät samaa yhteyttä ja samaa transaktiota.

tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}

Tx:n lauseet

Kutsukaa tx.Exec- ja tx.Query-metodeja aivan kuten db:llä, mutta kaikki suoritetaan transaktion sisällä, kunnes vahvistatte transaktion tai peruutatte sen.

_, err = tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, 1)

Commit

tx.Commit() tekee kaikki muutokset pysyviksi ja muiden nähtäviksi. Jos se palauttaa virheen, transaktiota ei otettu käyttöön.

if err := tx.Commit(); err != nil {
    log.Fatal(err)
}

Rollback

Jos jokin vaihe epäonnistuu, kutsukaa tx.Rollback()-metodia hylätäksenne kaikki Beginin jälkeen tehdyt muutokset. Tietokanta palautuu aiempaan tilaansa aivan kuin mitään ei olisi tapahtunut.

if err != nil {
    tx.Rollback()
    return err
}

defer Rollback -malli

Luotettava käytäntö on siirtää Rollback deferillä heti Beginin jälkeen. Onnistuneen Commitin jälkeinen Rollback on harmiton no-op, joten siivous varmistuu jokaisella virhepolulla.

tx, err := db.Begin()
if err != nil { return err }
defer tx.Rollback()
// ... do work ...
return tx.Commit()

Atominen siirtoesimerkki

Kaksi päivitystä muodostaa yhden loogisen toiminnon: vähennetään saldoa yhdeltä tililtä ja lisätään sitä toiselle. Molempien on vahvistuttava yhdessä, tai kumpaakaan ei pidä ottaa käyttöön.

Suoritettava transaktiosimulaatio

Oikeat transaktiot tarvitsevat tietokannan. Tämä suoritettava esimerkki simuloi transaktion aloittamista, kahta päivitystä ja commit- tai rollback-toimintoa muistissa olevan mapin avulla.

package main

import (
    "errors"
    "fmt"
)

func transfer(bal map[string]int, from, to string, amt int) error {
    if bal[from] < amt {
        return errors.New("insufficient funds")
    }
    snapshot := map[string]int{from: bal[from], to: bal[to]}
    bal[from] -= amt
    bal[to] += amt
    if bal[from] < 0 {
        bal[from], bal[to] = snapshot[from], snapshot[to]
        return errors.New("rolled back")
    }
    return nil
}

func main() {
    bal := map[string]int{"alice": 100, "bob": 20}
    if err := transfer(bal, "alice", "bob", 30); err != nil {
        fmt.Println("error:", err)
    } else {
        fmt.Println("committed:", bal)
    }
}

Eristystasot

db.BeginTx hyväksyy muun muassa eristystason määrittäviä asetuksia, kuten sql.LevelSerializable-asetuksen. Korkeampi eristystaso estää useampia poikkeamia, mutta voi vähentää samanaikaisuutta.

tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})

Transaktioiden pitäminen lyhyinä

Transaktio pitää yhteyttä varattuna ja voi pitää lukkoja hallussaan. Suorittakaa kaikki SQL nopeasti, välttäkää verkkokutsuja tai käyttäjän syötettä transaktion sisällä ja vahvistakaa transaktio nopeasti kilpailun vähentämiseksi.

db:n ja tx:n sekoittamisen välttäminen

Suorittakaa transaktion sisällä lauseet vain tx:llä. db.Exec-kutsun tekeminen käyttää eri yhteyttä transaktion ulkopuolella, joten kyseiset muutokset eivät kuulu transaktioon eivätkä peruunnu rollbackilla.

Pikatarkistus

Testatkaa tietämystänne transaktioista.

Kertaus

Opitte transaktiot:

  • Begin palauttaa *sql.Tx-olion; suorittakaa lauseet sen kautta
  • Commit säilyttää muutokset; Rollback hylkää kaikki muutokset
  • defer tx.Rollback() varmistaa siivouksen virheen sattuessa
  • BeginTx määrittää eristyksen; pitäkää transaktiot lyhyinä
  • Älkää koskaan sekoittako db:tä ja tx:ää saman transaktion sisällä
Aloita maksutta

Opi Go 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
51
Oppitunnit
203

Usein kysytyt kysymykset

Onko oppitunti ”Transaktiot” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Go Academy-oppimispolun 3 oppituntia, myös oppitunnin “Transaktiot”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Go Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Transaktiot”?

Vahvista ja peruuta Harjoittelet Go Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Go Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Go Academy-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”-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ä Go Academy-oppitunnilla?

Kyllä. Jokainen Go Academy-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. Yhteyden avaaminen
  2. Rivien kysely
  3. Valmistellut lauseet
  4. Transaktiot
← Takaisin: Go Academy