0Pricing
Go Academy · Aula

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 Commit

Pontos 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 rollback

Visã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 migrations

goose

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

  1. database/sql e drivers
  2. sqlx: leitura de structs e consultas nomeadas
  3. pgx: driver de alto desempenho para PostgreSQL
  4. Transações e migrações
← Voltar para Go Academy