Junior — Middle
É possível implementar transações aninhadas no sistema, e em que casos isso é permitido?
sobes.tech IA
Resposta da IA
Na biblioteca padrão do Go (pacote database/sql), transações aninhadas não são suportadas diretamente, pois a maioria dos SGBDs não implementam transações aninhadas completas. Em vez disso, frequentemente usam pontos de salvaguarda (savepoints), que permitem reverter a um estado específico dentro de uma transação.
Opções possíveis:
- Usar savepoints se o SGBD os suportar (por exemplo, PostgreSQL, MySQL). Em Go, isso pode ser feito executando comandos SQL
SAVEPOINT,ROLLBACK TO SAVEPOINT. - Imitar transações aninhadas através de transações separadas, mas isso nem sempre é correto do ponto de vista da lógica de negócio.
Quando é permitido:
- Quando é necessário reverter parcialmente alterações dentro de uma grande transação sem revertê-la completamente.
- Em operações complexas com várias etapas, onde cada etapa pode ser revertida separadamente.
Exemplo de uso de savepoints em Go:
tx, err := db.Begin()
if err != nil {
// tratamento de erro
}
_, err = tx.Exec("SAVEPOINT sp1")
if err != nil {
tx.Rollback()
return err
}
// Execução de operações
// Em caso de erro:
_, err = tx.Exec("ROLLBACK TO SAVEPOINT sp1")
// Continuação ou commit completo
err = tx.Commit()
Dessa forma, transações aninhadas são implementadas através de savepoints, e não por chamadas aninhadas a Begin/Commit.