Go Academy · Lektion

Transaktioner

Bekräfta och återställ

Lektion 4 av 413 steg

Transaktioner är en gratis lektion i Go Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Go Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Go Academy innehåller totalt 4 lektioner.

Varför transaktioner

En transaktion grupperar flera statements så att de antingen lyckas allihop eller misslyckas allihop. Det håller data konsekvent, till exempel när pengar flyttas mellan två konton utan att försvinna på vägen.

  • Atomisk: allt eller inget
  • Konsekvent tillstånd
  • Isolerad från andra transaktioner

db.Begin

Begin startar en transaktion och returnerar en *sql.Tx. Du kör statements på Tx, inte på poolen, så att de delar en anslutning och en transaktion.

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

Statements på Tx

Anropa tx.Exec och tx.Query precis som på db, men allt körs i transaktionen tills du committar eller gör rollback.

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

Commit

tx.Commit() gör alla ändringar permanenta och synliga för andra. Om det returnerar ett fel tillämpades transaktionen inte.

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

Rollback

Om något steg misslyckas anropar du tx.Rollback() för att kasta alla ändringar sedan Begin. Databasen återgår till sitt tidigare tillstånd, som om inget hade hänt.

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

Mönstret med defer Rollback

Ett robust idiom är att använda defer för Rollback direkt efter Begin. Rollback efter en lyckad Commit är en ofarlig no-op, så detta garanterar städning vid alla felvägar.

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

Exempel på atomisk överföring

Två uppdateringar bildar en logisk operation: dra av från ett konto och lägg till på ett annat. Båda måste committas tillsammans, annars ska ingen av dem tillämpas.

En körbar simulering av en transaktion

Riktiga transaktioner behöver en databas. Det här körbara exemplet simulerar begin, två uppdateringar och commit eller rollback med en map i minnet.

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)
    }
}

Isoleringsnivåer

db.BeginTx accepterar alternativ, bland annat en isoleringsnivå som sql.LevelSerializable. Högre isolering förhindrar fler avvikelser, men kan minska samtidigheten.

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

Håll transaktioner korta

En transaktion håller en anslutning och kan hålla lås. Kör all SQL snabbt, undvik nätverksanrop och användarinmatning i den och committa snabbt för att minska konkurrensen om resurser.

Blanda aldrig db och tx

I en transaktion ska du bara köra statements på tx. Om du anropar db.Exec där används en annan anslutning utanför transaktionen. Ändringarna ingår då inte i transaktionen och återställs inte vid rollback.

Snabbtest

Testa dina kunskaper om transaktioner.

Sammanfattning

Du har lärt dig om transaktioner:

  • Begin returnerar en *sql.Tx; kör statements på den
  • Commit sparar ändringarna; Rollback kastar alla ändringar
  • defer tx.Rollback() garanterar städning vid fel
  • BeginTx anger isolering; håll transaktioner korta
  • Blanda aldrig db och tx i samma transaktion
Gratis att börja

Lär dig Go med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”Transaktioner” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Go Academy, inklusive ”Transaktioner”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Go Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Transaktioner”?

Bekräfta och återställ Ni övar på Go Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Go Academy?

Du behöver inga förkunskaper. Utbildningen i Go Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Transaktioner”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Go Academy-lektionen?

Ja. Varje Go Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Öppna en anslutning
  2. Fråga efter rader
  3. Förberedda instruktioner
  4. Transaktioner
← Tillbaka till Go Academy