Transazioni e migrazioni
Modelli BEGIN/COMMIT e migrazioni dello schema
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 CommitSavepoint
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 rollbackPanoramica 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 migrationsgoose
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
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
- database/sql e driver
- sqlx: scansione delle struct e query con nome
- pgx: driver PostgreSQL ad alte prestazioni
- Transazioni e migrazioni