Middle — Middle+
¿Cómo gestionar las transacciones dentro de un solo método cuando se utilizan varias operaciones transaccionales, teniendo en cuenta el contexto de ejecución?
sobes.tech AI
Respuesta de la IA
En Go, para gestionar transacciones dentro de un mismo método con varias operaciones transaccionales, generalmente se utiliza un objeto de transacción obtenido del contexto de la base de datos (por ejemplo, *sql.Tx). Es importante pasar este objeto a cada función que realiza operaciones con la base de datos, para que todas formen parte de una misma transacción.
Ejemplo:
func doComplexOperation(db *sql.DB) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p)
} else if err != nil {
tx.Rollback()
} else {
err = tx.Commit()
}
}()
err = operation1(tx)
if err != nil {
return err
}
err = operation2(tx)
if err != nil {
return err
}
return nil
}
func operation1(tx *sql.Tx) error {
// Ejecución de consultas SQL usando tx.Exec o tx.Query
return nil
}
func operation2(tx *sql.Tx) error {
// Similar
return nil
}
De esta manera, todas las operaciones se realizan dentro de una misma transacción, y en caso de error, se realiza un rollback. El contexto de ejecución (context.Context) puede usarse para cancelar o establecer un tiempo límite, pasándolo a los métodos de consulta, pero el objeto de transacción en sí debe pasarse explícitamente.