ACID
Una transacción puede ejecutarse a medias si el sistema falla a mitad de camino. Dos transacciones pueden entrar en conflicto al modificar los mismos datos. Una base de datos transaccional sin garantías no es confiable para aplicaciones reales. ACID resuelve eso.
Tres conceptos que necesitás tener claros

Qué ocurre cuando una transacción falla a mitad de camino
Una transacción es una unidad de trabajo con uno o más pasos. Caso clásico: transferir dinero de la cuenta A a la cuenta B.
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 'A';
-- ¿qué pasa si el servidor se cae justo ACÁ?
UPDATE cuentas SET saldo = saldo + 100 WHERE id = 'B';
Si el sistema falla después del primer UPDATE pero antes del segundo, el dinero desaparece. La base de datos queda en un estado inconsistente.
¿Qué creés que ocurre con el dinero?
El primer UPDATE se ejecutó pero no hubo confirmación. Sin atomicidad, A perdió $100, B nunca los recibió, y $100 quedaron flotando en el vacío.
ACID es el conjunto de propiedades que evita este tipo de problemas.
Cómo ACID protege cada aspecto de una transacción
Atomicidad — “todo o nada”
Sin atomicidad, una falla a mitad de camino deja cambios parciales imposibles de deshacer. No hay forma de saber qué operaciones alcanzaron a persistir.

Consistencia — “los datos siempre cumplen las reglas”
La base de datos solo transiciona de un estado válido a otro. Las reglas del esquema (constraints, foreign keys, tipos de dato) se verifican en cada escritura; si algo las viola, la transacción se rechaza. Así nunca quedan precios negativos ni foreign keys huérfanas.

Aislamiento — “las transacciones concurrentes no se interfieren”
El nivel de aislamiento determina qué cambios de otras transacciones concurrentes puede observar una transacción. Sin aislamiento, las modificaciones simultáneas se interfieren y producen resultados incorrectos.

No existe un aislamiento que solucione todo. Cada nivel admite ciertas anomalías a cambio de mayor rendimiento.
Durabilidad — “una vez confirmado, no se pierde”
Cuando una transacción hace commit, los cambios sobreviven incluso ante un fallo del sistema, como un corte de luz o un crash del servidor.

El Write-Ahead Log (WAL) es un registro en disco donde la base de datos escribe cada cambio antes de confirmar la transacción. Si el servidor se cae, al reiniciar lee ese registro y recupera los cambios que ya estaban confirmados. Sin WAL, un corte eléctrico borraría todo lo que solo estaba en RAM.
| Propiedad | Garantiza | Lo evita |
|---|---|---|
| Atomicidad | Completa La transacción completa o se deshace | Medias Datos huérfanos, transferencias a medias |
| Consistencia | Válida Las reglas del esquema siempre se cumplen | Inválida Datos inválidos, violaciones de integridad |
| Aislamiento | Aislada Las transacciones concurrentes no se interfieren | Sucia Lecturas sucias, actualizaciones perdidas |
| Durabilidad | Persistente Los commits sobreviven a fallos | Perdida Pérdida de datos confirmados |
El mecanismo en acción
❌ Sin transacción: el dinero desaparece
-- Suponer que A tiene $500 y B tiene $0
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 'A';
-- saldo de A ahora: $400
--- FALLA DEL SISTEMA ---
UPDATE cuentas SET saldo = saldo + 100 WHERE id = 'B';
-- NUNCA SE EJECUTA
-- Resultado: A perdió $100, B nunca los recibió
✅ Con transacción: atomicidad protege
BEGIN;
UPDATE cuentas SET saldo = saldo - 100 WHERE id = 'A';
-- saldo de A ahora: $400
--- FALLA DEL SISTEMA ---
-- Al reiniciar, la BD ve que la transacción no hizo COMMIT.
-- Hace ROLLBACK automático.
-- saldo de A vuelve a: $500 (se deshizo el UPDATE)
-- saldo de B sigue: $0
✅ Consistencia: la base de datos rechaza datos inválidos
CREATE TABLE productos (
id SERIAL PRIMARY KEY,
precio DECIMAL(10,2) CHECK (precio > 0),
stock INTEGER CHECK (stock >= 0)
);
BEGIN;
INSERT INTO productos (precio, stock) VALUES (-5, 10);
-- ERROR: CHECK constraint "precio > 0" violated
-- La transacción se rechaza. La BD nunca queda con precios negativos.
COMMIT;
Cuándo conviene ACID pleno y cuándo conviene reducir sus garantías
| Enfoque | Ventaja | Desventaja |
|---|---|---|
| Transacciones con ACID pleno | Garantía total de integridad | Menor rendimiento en escritura concurrente |
| Reducir el nivel de aislamiento | Mayor throughput, menos locks | Riesgo de anomalías (lecturas sucias, etc.) |
| Desactivar confirmación inmediata en disco | Escrituras mucho más rápidas | Pérdida de datos confirmados si falla el servidor |
Casos de uso
| Situación | Recomendación |
|---|---|
| Transferencias bancarias, pagos | ACID pleno sin excepciones |
| Logs de auditoría, métricas | Reducir durabilidad (se puede regenerar) |
| Carrito de compras | ACID estándar con aislamiento default |
| Contadores de likes, visitas | Reducir aislamiento, usar lecturas no repetibles |
La consistencia de ACID no es la consistencia distribuida
Son conceptos distintos. ACID consistency habla de reglas del esquema. Eventual consistency (sistemas distribuidos) habla de cuándo los nodos ven los mismos datos.