Go Academy · Aula

Transações

Confirme e reverta transações

Aula 4 de 413 etapas

Transaçõ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.

Por que usar transações

Uma transação agrupa várias instruções para que todas sejam concluídas com sucesso ou todas falhem juntas. Isso mantém os dados consistentes, por exemplo, ao transferir dinheiro entre duas contas sem perdê-lo no meio da operação.

  • Atômica: tudo ou nada
  • Estado consistente
  • Isolada de outras transações

db.Begin

Begin inicia uma transação e retorna um *sql.Tx. Você executa as instruções em Tx, não no conjunto de conexões, para que elas compartilhem uma única conexão e uma única transação.

tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}

Instruções na transação

Chame tx.Exec e tx.Query assim como faria no banco de dados, mas tudo será executado dentro da transação até que você confirme ou desfaça as alterações.

_, err = tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, 1)

Commit

tx.Commit() torna todas as alterações permanentes e visíveis para os demais usuários. Se retornar um erro, a transação não foi aplicada.

if err := tx.Commit(); err != nil {
    log.Fatal(err)
}

Rollback

Se qualquer etapa falhar, chame tx.Rollback() para descartar todas as alterações feitas desde Begin. O banco de dados retorna ao estado anterior, como se nada tivesse acontecido.

if err != nil {
    tx.Rollback()
    return err
}

O padrão de adiamento com Rollback

Uma prática robusta é adiar Rollback logo após Begin. Executar Rollback depois de um Commit bem-sucedido não causa efeito, portanto isso garante a limpeza em qualquer caminho de erro.

tx, err := db.Begin()
if err != nil { return err }
defer tx.Rollback()
// ... do work ...
return tx.Commit()

Exemplo de transferência atômica

Du​as atualizações formam uma única operação lógica: subtrair de uma conta e adicionar a outra. Ambas devem ser confirmadas juntas; caso contrário, nenhuma deve ser aplicada.

Uma simulação executável de transação

Transações reais precisam de um banco de dados. Este exemplo executável simula o início, duas atualizações e a confirmação ou reversão usando um mapa na memória.

package main

import (
    "errors"
    "fmt"
)

func transfer(bal map[string]int, from, to string, amt int) error {
    if bal[from] < amt {
        return errors.New("insufficient funds")
    }
    snapshot := map[string]int{from: bal[from], to: bal[to]}
    bal[from] -= amt
    bal[to] += amt
    if bal[from] < 0 {
        bal[from], bal[to] = snapshot[from], snapshot[to]
        return errors.New("rolled back")
    }
    return nil
}

func main() {
    bal := map[string]int{"alice": 100, "bob": 20}
    if err := transfer(bal, "alice", "bob", 30); err != nil {
        fmt.Println("error:", err)
    } else {
        fmt.Println("committed:", bal)
    }
}

Níveis de isolamento

db.BeginTx aceita opções que incluem um nível de isolamento, como sql.LevelSerializable. Um isolamento maior evita mais anomalias, mas pode reduzir a concorrência.

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

Mantenha as transações curtas

Uma transação mantém uma conexão ocupada e pode manter bloqueios. Execute todo o SQL rapidamente, evite chamadas de rede ou entradas do usuário dentro dela e confirme prontamente para reduzir a contenção.

Nunca misture db e tx

Dentro de uma transação, execute as instruções somente em tx. Chamar db.Exec nesse ponto usa uma conexão diferente, fora da transação, portanto essas alterações não fazem parte dela e não serão revertidas.

Verificação rápida

Teste seus conhecimentos sobre transações.

Recapitulação

Você aprendeu sobre transações:

  • Begin retorna um *sql.Tx; execute as instruções nele
  • Commit persiste as alterações; Rollback descarta todas elas
  • defer tx.Rollback() garante a limpeza em caso de erro
  • BeginTx define o isolamento; mantenha as transações curtas
  • Nunca misture db e tx dentro da mesma transação
Grátis para começar

Aprenda Go com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Transações” é grátis?

Sim — o texto completo de “Transaçõ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”?

Confirme e reverta transações 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”?

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. Abertura de uma conexão
  2. Consulta de linhas
  3. Instruções preparadas
  4. Transações
← Voltar para Go Academy