0Pricing
Go Academy · Lección

Transacciones y migraciones

Patrones BEGIN/COMMIT y migraciones de esquemas

Transacciones y migraciones 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.

Transacciones en database/sql

Envuelva las operaciones en una transacción con db.BeginTx. Confirme o revierta la transacción al final; use siempre defer para una reversión con el fin de gestionar los panics.

tx, err := db.BeginTx(ctx, nil)
if err != nil { return err }
defer tx.Rollback() // no-op after Commit

_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance-100 WHERE id=$1", from)
if err != nil { return err }
_, err = tx.ExecContext(ctx, "UPDATE accounts SET balance=balance+100 WHERE id=$1", to)
if err != nil { return err }
return tx.Commit()

Niveles de aislamiento de transacciones

Pase sql.TxOptions para controlar el nivel de aislamiento:

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

Uso de la misma Tx en varias funciones

Pase *sql.Tx a las funciones auxiliares para que todas participen en la misma transacción. No llame a db.ExecContext dentro de una transacción; utilice tx.ExecContext.

Patrón de defer Rollback

Use defer para ejecutar Rollback inmediatamente después de BeginTx. Si Commit se ejecuta correctamente, el rollback posterior no tiene ningún efecto. Si Commit falla, rollback revierte los cambios.

tx, _ := db.BeginTx(ctx, nil)
defer tx.Rollback() // safe no-op after successful Commit

Puntos de guardado

Use puntos de guardado dentro de una transacción para realizar reversiones parciales (específico de PostgreSQL mediante SQL sin procesar):

tx.ExecContext(ctx, "SAVEPOINT sp1")
// ... work ...
tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT sp1") // partial rollback

Descripción general de las migraciones de bases de datos

Las migraciones son scripts SQL versionados que permiten evolucionar el esquema de forma incremental. Cada migración tiene una dirección up (aplicar) y una dirección down (revertir).

golang-migrate

github.com/golang-migrate/migrate/v4 ejecuta en orden los archivos de migración SQL versionados y registra la versión aplicada en una tabla schema_migrations.

m, _ := migrate.New("file://migrations", dsn)
m.Up() // apply all pending migrations

goose

github.com/pressly/goose/v3 es otra biblioteca de migraciones popular que admite migraciones SQL y migraciones mediante funciones de Go, con comandos up/down.

goose.Up(db, "migrations")

Atlas para la gestión del esquema

Atlas proporciona una gestión declarativa del esquema: defina el estado deseado del esquema y Atlas calcula las diferencias y genera automáticamente los scripts de migración.

Ejecución de migraciones al iniciar

Ejecute las migraciones mediante código en main antes de iniciar el servidor para garantizar que el esquema esté actualizado en cada despliegue.

if err := runMigrations(db); err != nil { log.Fatal(err) }

Buenas prácticas para las migraciones

Cada migración debe abordar una sola cuestión y ser compatible con versiones futuras (aditiva). Nunca elimine columnas de inmediato: márquelas como obsoletas y elimínelas en una migración posterior, cuando el código ya no haga referencia a ellas.

Comprobación rápida

¿Por qué debe ejecutar siempre tx.Rollback() mediante defer inmediatamente después de BeginTx?

Recapitulación: transacciones y migraciones

Puntos clave:

  • BeginTx → defer Rollback → trabajo → Commit
  • Pase *sql.Tx a las funciones auxiliares; use tx.ExecContext, no db.ExecContext
  • Use golang-migrate o goose para las migraciones SQL versionadas
  • Ejecute las migraciones al iniciar y mantenga cada migración como una operación aditiva

Preguntas frecuentes

¿La lección «Transacciones y migraciones» es gratis?

Sí — el texto completo de «Transacciones y migraciones» 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 y migraciones»?

Patrones BEGIN/COMMIT y migraciones de esquemas 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 y migraciones»?

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. database/sql y drivers
  2. sqlx: escaneo de structs y consultas con nombre
  3. pgx: driver de PostgreSQL de alto rendimiento
  4. Transacciones y migraciones
← Volver a Go Academy