Skip to content

Transacciones y concurrencia

Una transaccion agrupa operaciones que deben completarse juntas. PostgreSQL garantiza propiedades ACID: atomicidad, consistencia, aislamiento y durabilidad.

Transaccion basica

sql
BEGIN;

UPDATE cuentas
SET saldo = saldo - 100
WHERE id = 1;

UPDATE cuentas
SET saldo = saldo + 100
WHERE id = 2;

COMMIT;

Si algo falla:

sql
ROLLBACK;

Aislamiento

PostgreSQL usa MVCC, lo que permite que lectores y escritores convivan mejor.

Niveles habituales:

  • READ COMMITTED: por defecto.
  • REPEATABLE READ: vista estable durante la transaccion.
  • SERIALIZABLE: mayor aislamiento, posible necesidad de reintentos.
sql
BEGIN ISOLATION LEVEL REPEATABLE READ;

Bloqueos

Al modificar filas, PostgreSQL bloquea esas filas:

sql
SELECT *
FROM tareas
WHERE estado = 'pendiente'
FOR UPDATE SKIP LOCKED
LIMIT 10;

SKIP LOCKED es util para colas de trabajo con varios workers.

Deadlocks

Un deadlock ocurre cuando dos transacciones esperan recursos bloqueados entre si. PostgreSQL detecta el problema y cancela una transaccion.

Reducelo:

  • Actualizando tablas siempre en el mismo orden.
  • Manteniendo transacciones cortas.
  • Evitando esperar interacciones de usuario dentro de una transaccion.

Buenas practicas

  • Haz transacciones pequenas.
  • Reintenta operaciones que fallen por serializacion.
  • Usa constraints para proteger reglas criticas.
  • Bloquea filas explicitamente cuando haga falta.
  • No mezcles operaciones externas lentas dentro de una transaccion.

Errores comunes

  • Dejar transacciones abiertas.
  • Procesar lotes enormes en una sola transaccion.
  • Leer-modificar-escribir sin proteccion ante concurrencia.
  • Confundir bloqueo de fila con bloqueo de tabla.
  • Ignorar deadlocks en logs.

Recursos relacionados