Transakcje i migracje
Wzorce BEGIN/COMMIT i migracje schematu
Transakcje i migracje 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.
Transakcje w database/sql
Operacje należy opakować w transakcję za pomocą db.BeginTx. Na końcu należy wykonać zatwierdzenie lub wycofanie; zawsze należy odroczyć wycofanie, aby obsłużyć paniki.
tx, err := db.BeginTx(ctx, nil)
if err != nil { return err }
defer tx.Rollback() // no-op after Commit
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance-100 WHERE id=$1", from)
if err != nil { return err }
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance+100 WHERE id=$1", to)
if err != nil { return err }
return tx.Commit()Poziomy izolacji transakcji
Do kontrolowania poziomu izolacji należy przekazać sql.TxOptions:
tx, err := db.BeginTx(ctx, &sql.TxOptions{
Isolation: sql.LevelSerializable,
ReadOnly: false,
})Używanie tej samej Tx w wielu funkcjach
Należy przekazywać *sql.Tx do funkcji pomocniczych, aby wszystkie uczestniczyły w tej samej transakcji. W transakcji nie należy wywoływać db.ExecContext — należy używać tx.ExecContext.
Wzorzec Defer Rollback
Odrocz wywołanie Rollback natychmiast po BeginTx. Jeśli Commit zakończy się powodzeniem, późniejsze wycofanie nie wykona żadnej operacji. Jeśli Commit się nie powiedzie, wycofanie cofnie zmiany.
tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful CommitPunkty zapisu
Używaj punktów zapisu w ramach transakcji, aby częściowo wycofywać zmiany (rozwiązanie specyficzne dla PostgreSQL za pośrednictwem surowego SQL):
tx.ExecContext(ctx, "SAVEPOINT sp1")
// ... work ...
tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT sp1") // partial rollbackPrzegląd migracji bazy danych
Migracje to wersjonowane skrypty SQL, które stopniowo zmieniają schemat. Każda migracja ma kierunek up (zastosowanie) oraz down (wycofanie).
golang-migrate
github.com/golang-migrate/migrate/v4 uruchamia kolejno wersjonowane pliki migracji SQL i śledzi zastosowaną wersję w tabeli schema_migrations.
m, _ := migrate.New("file://migrations", dsn)
m.Up() // apply all pending migrationsgoose
github.com/pressly/goose/v3 to kolejna popularna biblioteka do migracji, obsługująca migracje SQL oraz migracje w postaci funkcji Go za pomocą poleceń up/down.
goose.Up(db, "migrations")Atlas do zarządzania schematem
Atlas zapewnia deklaratywne zarządzanie schematem: definiujesz jego docelowy stan, a Atlas oblicza różnice i automatycznie generuje skrypty migracji.
Uruchamianie migracji podczas startu
Uruchamiaj migracje programowo w funkcji main przed uruchomieniem serwera, aby podczas wdrażania zapewnić aktualność schematu.
if err := runMigrations(db); err != nil { log.Fatal(err) }Najlepsze praktyki dotyczące migracji
Każda migracja powinna dotyczyć jednego zagadnienia i być zgodna wstecznie (addytywna). Nigdy nie usuwaj kolumn od razu — oznacz je jako przestarzałe i usuń w późniejszej migracji, gdy kod nie będzie już się do nich odwoływać.
Szybkie sprawdzenie
Dlaczego należy zawsze odraczać wywołanie tx.Rollback() natychmiast po BeginTx?
Podsumowanie: transakcje i migracje
Najważniejsze informacje:
- BeginTx → defer Rollback → praca → Commit
- Przekazuj *sql.Tx do funkcji pomocniczych; używaj tx.ExecContext zamiast db.ExecContext
- Używaj golang-migrate lub goose do wersjonowanych migracji SQL
- Uruchamiaj migracje podczas startu; każda migracja powinna być addytywna
Często zadawane pytania
Czy lekcja „Transakcje i migracje” jest bezpłatna?
Tak — pełny tekst „Transakcje i migracje” 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 i migracje”?
Wzorce BEGIN/COMMIT i migracje schematu Ć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 i migracje”?
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.
Wszystkie lekcje w tym kursie
- database/sql i sterowniki
- sqlx: mapowanie struktur i nazwane zapytania
- pgx: wysokowydajny sterownik PostgreSQL
- Transakcje i migracje