Go Academy · Lezione

Transazioni e migrazioni

Modelli BEGIN/COMMIT e migrazioni dello schema

Lezione 4 di 413 passaggi

Transazioni e migrazioni è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Transazioni in database/sql

Racchiuda le operazioni in una transazione con db.BeginTx. Esegua il commit o il rollback al termine; rimandi sempre un rollback per gestire i panic.

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

Livelli di isolamento delle transazioni

Passi sql.TxOptions per controllare il livello di isolamento:

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

Utilizzo dello stesso Tx tra più funzioni

Passi *sql.Tx alle funzioni helper affinché partecipino tutte alla stessa transazione. Non chiami db.ExecContext all'interno di una transazione: utilizzi tx.ExecContext.

Pattern Defer Rollback

Applichi defer a Rollback subito dopo BeginTx. Se Commit va a buon fine, il rollback successivo non produce alcun effetto. Se Commit fallisce, il rollback annulla le modifiche.

tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful Commit

Savepoint

Utilizzi i savepoint all'interno di una transazione per eseguire rollback parziali (specifici di PostgreSQL tramite SQL diretto):

tx.ExecContext(ctx, "SAVEPOINT sp1")
// ... work ...
tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT sp1") // partial rollback

Panoramica delle migrazioni del database

Le migrazioni sono script SQL versionati che fanno evolvere lo schema in modo incrementale. Ogni migrazione ha una direzione up (applicazione) e una down (ripristino).

golang-migrate

github.com/golang-migrate/migrate/v4 esegue in ordine i file di migrazione SQL versionati e tiene traccia della versione applicata in una tabella schema_migrations.

m, _ := migrate.New("file://migrations", dsn)
m.Up() // apply all pending migrations

goose

github.com/pressly/goose/v3 è un'altra libreria di migrazione molto diffusa, che supporta le migrazioni SQL e quelle basate su funzioni Go con i comandi up/down.

goose.Up(db, "migrations")

Atlas per la gestione dello schema

Atlas offre una gestione dichiarativa dello schema: si definisce lo stato desiderato dello schema e Atlas calcola le differenze e genera automaticamente gli script di migrazione.

Esecuzione delle migrazioni all'avvio

Esegua le migrazioni programmaticamente in main prima di avviare il server, per assicurarsi che lo schema sia aggiornato al momento del deploy.

if err := runMigrations(db); err != nil { log.Fatal(err) }

Buone pratiche per le migrazioni

Ogni migrazione deve riguardare un solo aspetto ed essere compatibile con le versioni future (additiva). Non elimini mai le colonne immediatamente: le contrassegni come deprecate e le rimuova in una migrazione successiva, dopo che il codice ha smesso di farvi riferimento.

Verifica rapida

Perché è necessario applicare sempre defer a tx.Rollback() subito dopo BeginTx?

Riepilogo: transazioni e migrazioni

Punti chiave:

  • BeginTx → defer Rollback → lavoro → Commit
  • Passi *sql.Tx alle funzioni di supporto; utilizzi tx.ExecContext, non db.ExecContext
  • Utilizzi golang-migrate o goose per le migrazioni SQL versionate
  • Esegua le migrazioni all'avvio; mantenga ogni migrazione additiva
Gratis per iniziare

Impara Go con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «Transazioni e migrazioni» è gratuita?

Sì — il testo completo di «Transazioni e migrazioni» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Transazioni e migrazioni»?

Modelli BEGIN/COMMIT e migrazioni dello schema Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Transazioni e migrazioni»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. database/sql e driver
  2. sqlx: scansione delle struct e query con nome
  3. pgx: driver PostgreSQL ad alte prestazioni
  4. Transazioni e migrazioni
← Torna a Go Academy