Transaktioner
Bekräfta och återställ
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
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.