Nivel 2 · 25 min
Transacciones
Los niveles de aislamiento de transacciones determinan qué fenómenos de concurrencia pueden ver las transacciones. PostgreSQL implementa cuatro niveles: Read Uncommitted (equivale a Read Committed en PG), Read Committed, Repeatable Read, y Serializable.
Fenómenos de Lectura
Dirty Read: leer datos no committed (PG nunca permite esto). Non-repeatable Read: la misma fila se lee dos veces y el resultado difiere porque otra transacción la modificó y committeó entre medias. Phantom Read: una consulta retorna filas diferentes porque otra transacción insertó o eliminó filas que matchean el WHERE.
Niveles de Aislamiento
Read Committed (default): cada statement ve su propia snapshot —previene dirty reads pero permite non-repeatable reads. Repeatable Read: toda la transacción ve la misma snapshot —previene non-repeatable reads y phantoms en PG (implementación más fuerte que el estándar SQL). Serializable: garantiza que el resultado es equivalente a algún orden serial de ejecución —usa SSI (Serializable Snapshot Isolation).
Locking vs MVCC
SELECT FOR UPDATE adquiere un lock de fila pesimista —previene que otras transacciones modifiquen esas filas. Útil cuando necesitás leer-modificar-escribir atómicamente. Para contadores en alta concurrencia, considerá operaciones atómicas (UPDATE counter SET value = value + 1) en lugar de SELECT + UPDATE separados.
Code example
-- Nivel de aislamiento para la transacción
BEGIN ISOLATION LEVEL REPEATABLE READ;
SELECT balance FROM accounts WHERE id = $1;
-- ... lógica de negocio ...
UPDATE accounts SET balance = $2 WHERE id = $1;
COMMIT;
-- Select for update: lock pesimista
BEGIN;
SELECT * FROM inventory WHERE sku = $1 FOR UPDATE;
-- Nadie más puede modificar esta fila hasta COMMIT/ROLLBACK
UPDATE inventory SET stock = stock - $2 WHERE sku = $1;
COMMIT;