Transakcje
Zatwierdzaj i wycofuj zmiany
Transakcje to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.
Dlaczego transakcje
Transakcja grupuje kilka instrukcji, dzięki czemu wszystkie kończą się powodzeniem albo wszystkie są wycofywane. Pozwala to zachować spójność danych, na przykład podczas przelewania pieniędzy między dwoma kontami bez ryzyka utraty środków w połowie operacji.
- Atomowość: wszystko albo nic
- Spójny stan
- Izolacja od innych transakcji
db.Begin
Begin rozpoczyna transakcję i zwraca obiekt *sql.Tx. Instrukcje wykonuje się na obiekcie Tx, a nie na puli, dzięki czemu korzystają z jednego połączenia i jednej transakcji.
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}Instrukcje na obiekcie Tx
Wywołuj tx.Exec i tx.Query tak samo jak na obiekcie db, ale wszystko działa wewnątrz transakcji aż do jej zatwierdzenia lub wycofania.
_, err = tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, 1)Commit
tx.Commit() utrwala każdą zmianę i sprawia, że staje się ona widoczna dla innych. Jeśli zwróci błąd, transakcja nie została zastosowana.
if err := tx.Commit(); err != nil {
log.Fatal(err)
}Rollback
Jeśli dowolny krok zakończy się niepowodzeniem, wywołaj tx.Rollback(), aby odrzucić wszystkie zmiany od momentu Begin. Baza danych powróci do poprzedniego stanu, tak jakby nic się nie wydarzyło.
if err != nil {
tx.Rollback()
return err
}Wzorzec defer Rollback
Solidny idiom polega na odroczeniu Rollback natychmiast po Begin. Rollback po pomyślnym Commit jest bezpieczną operacją bez efektu, więc gwarantuje zwolnienie zasobów na każdej ścieżce błędu.
tx, err := db.Begin()
if err != nil { return err }
defer tx.Rollback()
// ... do work ...
return tx.Commit()Przykład atomowego przelewu
Dwie aktualizacje tworzą jedną logiczną operację: odjęcie środków z jednego konta i dodanie ich do drugiego. Obie muszą zostać zatwierdzone razem albo żadna z nich nie powinna zostać zastosowana.
Symulacja transakcji możliwa do uruchomienia
Prawdziwe transakcje wymagają bazy danych. Ten przykład możliwy do uruchomienia symuluje rozpoczęcie transakcji, dwie aktualizacje oraz zatwierdzenie lub wycofanie zmian za pomocą mapy przechowywanej w pamięci.
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)
}
}Poziomy izolacji
db.BeginTx przyjmuje opcje, w tym poziom izolacji, taki jak sql.LevelSerializable. Wyższy poziom izolacji zapobiega większej liczbie anomalii, ale może ograniczyć współbieżność.
tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})Utrzymuj transakcje krótkie
Transakcja zajmuje połączenie i może utrzymywać blokady. Wykonuj wszystkie operacje SQL szybko, unikaj wywołań sieciowych i danych wprowadzanych przez użytkownika wewnątrz transakcji oraz niezwłocznie ją zatwierdzaj, aby ograniczyć rywalizację o zasoby.
Nigdy nie mieszaj db i tx
Wewnątrz transakcji wykonuj instrukcje wyłącznie na obiekcie tx. Wywołanie db.Exec używa innego połączenia, poza transakcją, więc te zmiany nie są jej częścią i nie zostaną wycofane.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat transakcji.
Podsumowanie
Użytkownik poznał transakcje:
- Begin zwraca *sql.Tx; instrukcje należy wykonywać na tym obiekcie
- Commit utrwala zmiany, a Rollback je wszystkie odrzuca
- defer tx.Rollback() gwarantuje zwolnienie zasobów w przypadku błędu
- BeginTx ustawia poziom izolacji; transakcje należy utrzymywać krótkie
- W ramach jednej transakcji nigdy nie należy mieszać db i tx
Często zadawane pytania
Czy lekcja „Transakcje” jest bezpłatna?
Tak — pełny tekst „Transakcje” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Transakcje”?
Zatwierdzaj i wycofuj zmiany Ćwiczysz Go Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Go Academy?
Nie wymagamy żadnego doświadczenia. Go Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Transakcje”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Go Academy?
Tak. Każda lekcja Go Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.