Transações
Confirme e reverta transações
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
Duas 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
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.