Go Academy · Lección

Transacciones

Confirme y revierta transacciones

Lección 4 de 413 pasos

Transacciones es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Por qué usar transacciones

Una transacción agrupa varias sentencias para que todas tengan éxito o fallen juntas. Esto mantiene la coherencia de los datos; por ejemplo, permite transferir dinero entre dos cuentas sin perderlo a mitad de la operación.

  • Atómica: todo o nada
  • Estado coherente
  • Aislada de otras transacciones

db.Begin

Begin inicia una transacción y devuelve un *sql.Tx. Las sentencias se ejecutan en Tx, no en el pool, de modo que comparten una conexión y una transacción.

tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}

Sentencias en Tx

Llame a tx.Exec y tx.Query igual que en db, pero todo se ejecutará dentro de la transacción hasta que confirme o revierta los cambios.

_, err = tx.Exec("UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, 1)

Commit

tx.Commit() hace que todos los cambios sean permanentes y visibles para los demás. Si devuelve un error, la transacción no se aplicó.

if err := tx.Commit(); err != nil {
    log.Fatal(err)
}

Rollback

Si falla algún paso, llame a tx.Rollback() para descartar todos los cambios realizados desde Begin. La base de datos vuelve a su estado anterior, como si no hubiera ocurrido nada.

if err != nil {
    tx.Rollback()
    return err
}

El patrón defer Rollback

Una práctica recomendada consiste en diferir Rollback inmediatamente después de Begin. Hacer Rollback después de un Commit correcto no tiene ningún efecto perjudicial, por lo que garantiza la limpieza en cualquier ruta de error.

tx, err := db.Begin()
if err != nil { return err }
defer tx.Rollback()
// ... do work ...
return tx.Commit()

Ejemplo de transferencia atómica

Dos actualizaciones forman una sola operación lógica: restar dinero de una cuenta y sumarlo a otra. Ambas deben confirmarse juntas o no debe aplicarse ninguna.

Una simulación ejecutable de transacciones

Las transacciones reales necesitan una base de datos. Este ejemplo ejecutable simula el inicio, dos actualizaciones y la confirmación o reversión mediante un mapa en memoria.

package main

import (
    "errors"
    "fmt"
)

func transfer(bal map[string]int, from, to string, amt int) error {
    if bal[from] < amt {
        return errors.New("insufficient funds")
    }
    snapshot := map[string]int{from: bal[from], to: bal[to]}
    bal[from] -= amt
    bal[to] += amt
    if bal[from] < 0 {
        bal[from], bal[to] = snapshot[from], snapshot[to]
        return errors.New("rolled back")
    }
    return nil
}

func main() {
    bal := map[string]int{"alice": 100, "bob": 20}
    if err := transfer(bal, "alice", "bob", 30); err != nil {
        fmt.Println("error:", err)
    } else {
        fmt.Println("committed:", bal)
    }
}

Niveles de aislamiento

db.BeginTx acepta opciones, incluido un nivel de aislamiento, como sql.LevelSerializable. Un mayor aislamiento evita más anomalías, pero puede reducir la concurrencia.

tx, err := db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable})

Mantenga cortas las transacciones

Una transacción mantiene una conexión y puede mantener bloqueos. Ejecute todo el SQL rápidamente, evite las llamadas de red o la entrada del usuario dentro de ella y confírmela pronto para reducir la contención.

No mezcle nunca db y tx

Dentro de una transacción, ejecute las sentencias únicamente en tx. Llamar a db.Exec allí utiliza una conexión diferente fuera de la transacción, por lo que esos cambios no forman parte de ella y no se revertirán.

Comprobación rápida

Ponga a prueba sus conocimientos sobre transacciones.

Resumen

Ha aprendido sobre las transacciones:

  • Begin devuelve un *sql.Tx; ejecute las sentencias en él
  • Commit conserva los cambios; Rollback los descarta todos
  • defer tx.Rollback() garantiza la limpieza en caso de error
  • BeginTx establece el aislamiento; mantenga cortas las transacciones
  • No mezcle db y tx dentro de una misma transacción
Gratis para empezar

Aprende Go con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Transacciones» es gratis?

Sí — el texto completo de «Transacciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Transacciones»?

Confirme y revierta transacciones Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Transacciones»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Apertura de una conexión
  2. Consulta de filas
  3. Sentencias preparadas
  4. Transacciones
← Volver a Go Academy