Sobes.tech
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.