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