Junior — Middle
¿Es posible implementar transacciones anidadas en el sistema, y en qué casos es esto aceptable?
sobes.tech AI
Respuesta de la IA
En la biblioteca estándar de Go (paquete database/sql), las transacciones anidadas no son compatibles directamente, ya que la mayoría de los sistemas de gestión de bases de datos (SGBD) no implementan transacciones anidadas completas. En su lugar, a menudo se utilizan puntos de guardado (savepoints), que permiten revertir a un estado específico dentro de una transacción.
Opciones posibles:
- Usar savepoints si el SGBD los soporta (por ejemplo, PostgreSQL, MySQL). En Go, esto se puede hacer mediante la ejecución de comandos SQL
SAVEPOINT,ROLLBACK TO SAVEPOINT. - Imitar transacciones anidadas mediante transacciones separadas, pero esto no siempre es correcto desde el punto de vista de la lógica de negocio.
Cuándo es permitido:
- Cuando se necesita revertir parcialmente cambios dentro de una gran transacción sin revertirla por completo.
- En operaciones complejas con múltiples etapas, donde cada etapa puede revertirse por separado.
Ejemplo de uso de savepoints en Go:
trx, err := db.Begin()
if err != nil {
// manejo del error
}
_, err = trx.Exec("SAVEPOINT sp1")
if err != nil {
trx.Rollback()
return err
}
// Ejecución de operaciones
// En caso de error:
_, err = trx.Exec("ROLLBACK TO SAVEPOINT sp1")
// Continuar o hacer commit completo
err = trx.Commit()
De esta forma, las transacciones anidadas se implementan mediante savepoints, y no mediante llamadas anidadas a Begin/Commit.