Skip to content

Locks, MVCC y niveles de aislamiento

MySQL con InnoDB permite concurrencia alta gracias a MVCC y bloqueos por fila, pero las transacciones mal diseñadas pueden causar esperas, deadlocks y lecturas inesperadas.

MVCC

MVCC permite que una transaccion lea una version consistente sin bloquear escrituras normales.

mermaid
flowchart LR
  T1["Transaction A reads snapshot"] --> U["Undo logs"]
  T2["Transaction B updates row"] --> R["Current row"]

Niveles de aislamiento

Ver nivel actual:

sql
SELECT @@transaction_isolation;

Niveles comunes:

  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

MySQL usa REPEATABLE READ por defecto en muchas instalaciones.

Lectura consistente

Una consulta normal:

sql
SELECT * FROM pedidos WHERE id = 10;

No bloquea la fila en condiciones normales. Lee una version consistente.

Lectura con bloqueo

sql
SELECT * FROM pedidos WHERE id = 10 FOR UPDATE;

Bloquea para modificar de forma segura dentro de la transaccion.

Gap locks

En ciertos niveles de aislamiento, InnoDB puede bloquear rangos para evitar phantom reads.

Esto puede sorprender en consultas por rango:

sql
SELECT * FROM reservas
WHERE sala_id = 1 AND fecha = '2026-06-26'
FOR UPDATE;

Deadlocks

Un deadlock ocurre cuando dos transacciones esperan recursos entre si.

txt
T1 bloquea A y espera B
T2 bloquea B y espera A

InnoDB detecta deadlocks y cancela una transaccion.

Diagnostico

sql
SHOW ENGINE INNODB STATUS;

Tambien revisa Performance Schema para esperas y locks.

Buenas practicas

  • Mantén transacciones cortas.
  • Accede a tablas en el mismo orden.
  • Indexa filtros usados en updates/deletes.
  • No esperes input externo dentro de una transaccion.
  • Maneja deadlocks con reintentos controlados.
  • Usa FOR UPDATE solo cuando sea necesario.