Transações e migrações
Padrões BEGIN/COMMIT e migrações de esquema
Transações e migrações é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
Transações em database/sql
Envolva as operações em uma transação com db.BeginTx. Faça commit ou rollback ao final; sempre adie um rollback para lidar com pânicos.
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()Níveis de isolamento de transações
Passe sql.TxOptions para controlar o nível de isolamento:
tx, err := db.BeginTx(ctx, &sql.TxOptions{
Isolation: sql.LevelSerializable,
ReadOnly: false,
})Usando o mesmo Tx entre funções
Passe o *sql.Tx para as funções auxiliares, para que todas participem da mesma transação. Não chame db.ExecContext dentro de uma transação — use tx.ExecContext.
Padrão de adiamento de Rollback
Adie Rollback imediatamente após BeginTx. Se Commit for bem-sucedido, a reversão subsequente não terá efeito. Se Commit falhar, a reversão desfará as alterações.
tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful CommitPontos de salvamento
Utilize pontos de salvamento dentro de uma transação para realizar reversões parciais (específicas do PostgreSQL por meio de SQL bruto):
tx.ExecContext(ctx, "SAVEPOINT sp1")
// ... work ...
tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT sp1") // partial rollbackVisão geral das migrações do banco de dados
As migrações são scripts SQL versionados que evoluem o esquema de forma incremental. Cada migração tem uma direção de aplicação (up) e uma direção de reversão (down).
golang-migrate
github.com/golang-migrate/migrate/v4 executa os arquivos de migração SQL versionados em ordem e registra a versão aplicada em uma tabela schema_migrations.
m, _ := migrate.New("file://migrations", dsn)
m.Up() // apply all pending migrationsgoose
github.com/pressly/goose/v3 é outra biblioteca de migrações popular, compatível com migrações SQL e com funções Go, além de comandos up/down.
goose.Up(db, "migrations")Atlas para gerenciamento de esquemas
O Atlas oferece gerenciamento declarativo de esquemas: defina o estado desejado do esquema, e o Atlas calculará a diferença e gerará os scripts de migração automaticamente.
Execução de migrações na inicialização
Execute as migrações programaticamente em main antes de iniciar o servidor para garantir que o esquema esteja atualizado durante a implantação.
if err := runMigrations(db); err != nil { log.Fatal(err) }Boas práticas para migrações
Cada migração deve tratar de uma única preocupação e ser compatível com versões futuras (aditiva). Nunca exclua colunas imediatamente: marque-as como obsoletas e remova-as em uma migração posterior, depois que o código deixar de fazer referência a elas.
Verificação rápida
Por que você deve sempre adiar tx.Rollback() imediatamente após BeginTx?
Recapitulação: transações e migrações
Pontos principais:
- BeginTx → defer Rollback → trabalho → Commit
- Passe *sql.Tx para as funções auxiliares; utilize tx.ExecContext em vez de db.ExecContext
- Utilize golang-migrate ou goose para migrações SQL versionadas
- Execute as migrações na inicialização; mantenha cada migração aditiva
Perguntas Frequentes
A aula “Transações e migrações” é grátis?
Sim — o texto completo de “Transações e migrações” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “Transações e migrações”?
Padrões BEGIN/COMMIT e migrações de esquema Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Transações e migrações”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- database/sql e drivers
- sqlx: leitura de structs e consultas nomeadas
- pgx: driver de alto desempenho para PostgreSQL
- Transações e migrações