0Pricing
SQL Interview Prep · Lección

Interbloqueos, bloqueos y MVCC

Cómo evitan las bases de datos los conflictos y cuáles son las ventajas y desventajas de los bloqueos frente a las instantáneas.

Interbloqueos, bloqueos y MVCC es una lección gratuita de SQL Interview Prep 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 SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

Cómo implementan realmente el aislamiento las bases de datos

Los niveles de aislamiento son la promesa; los bloqueos y MVCC son los mecanismos que la hacen posible. Los entrevistadores preguntan por ellos para comprobar si entiende qué ocurre internamente cuando las transacciones entran en conflicto.

Hay dos estrategias generales:

  • Pesimista (basada en bloqueos): bloquear el acceso en conflicto hasta que se libere un bloqueo.
  • Optimista / MVCC: permitir que todos lean una instantánea coherente y detectar los conflictos al confirmar la transacción.

Esta lección cubre los bloqueos, los interbloqueos y MVCC, además de las ventajas y desventajas de cada enfoque.

Bloqueos compartidos frente a exclusivos

El bloqueo clásico utiliza dos modos principales:

  • Bloqueo compartido (S) para lecturas. Muchas transacciones pueden mantener simultáneamente un bloqueo compartido sobre la misma fila.
  • Bloqueo exclusivo (X) para escrituras. Solo una transacción puede mantenerlo y bloquea todos los demás bloqueos sobre esa fila.

La regla es la siguiente: S es compatible con S, pero X no es compatible con ningún otro bloqueo. Un escritor debe esperar a que terminen todos los lectores, y los lectores deben esperar a un escritor.

Bloqueo explícito con SELECT FOR UPDATE

Puede solicitar un bloqueo de escritura sobre filas que solo va a leer, para evitar que otros las modifiquen antes de que usted actúe. Esta es la forma estándar de evitar actualizaciones perdidas en un ciclo de lectura, modificación y escritura.

SELECT ... FOR UPDATE adquiere bloqueos exclusivos de fila; las filas permanecen bloqueadas hasta que se ejecuta COMMIT o ROLLBACK.

BEGIN;
-- lock the row so no one else can modify it concurrently
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;  -- lock released here

¿Qué es un interbloqueo?

Un interbloqueo ocurre cuando dos o más transacciones mantienen cada una un bloqueo que la otra necesita, formando un ciclo en el que ninguna puede avanzar.

El caso clásico es el siguiente: T1 bloquea la fila A y después solicita la fila B; T2 bloquea la fila B y después solicita la fila A. Cada una espera indefinidamente a la otra.

Las bases de datos detectan esta situación mediante un grafo de espera. Cuando encuentran un ciclo, el motor elige una víctima y la cancela, devolviendo un error de interbloqueo para que las demás puedan continuar.

Interbloqueo: línea de tiempo

Observe cómo se cruzan los órdenes de bloqueo. T1 adquiere la fila 1 y después solicita la fila 2; T2 adquiere la fila 2 y después solicita la fila 1. Ninguna libera su bloqueo, así que el motor cancela una de las dos.

La transacción cancelada recibe un error como deadlock detected y debe reintentarse. La transacción superviviente confirma normalmente.

-- T1                                  | -- T2
BEGIN;                                 | BEGIN;
UPDATE accounts SET balance=balance-10  | UPDATE accounts SET balance=balance-10
  WHERE id=1;  -- locks row 1          |   WHERE id=2;  -- locks row 2
UPDATE accounts SET balance=balance+10  | UPDATE accounts SET balance=balance+10
  WHERE id=2;  -- waits for T2         |   WHERE id=1;  -- waits for T1 -> CYCLE
-- one transaction is chosen as victim and rolled back

Prevención de interbloqueos

No puede eliminar por completo los interbloqueos, pero sí hacer que sean poco frecuentes. Respuestas habituales en entrevistas:

  • Orden coherente de los bloqueos: adquirir siempre las filas en el mismo orden (por ejemplo, por id ascendente). Esto rompe el ciclo.
  • Mantener las transacciones cortas: conservar los bloqueos durante el menor tiempo posible.
  • Reducir el aislamiento cuando sea seguro: menos bloqueos implican menos conflictos.
  • Añadir lógica de reintento: las transacciones elegidas como víctimas de un interbloqueo deben reintentarse automáticamente.

El orden coherente es la medida más eficaz y la primera que los entrevistadores quieren escuchar.

Granularidad de los bloqueos

Los bloqueos pueden aplicarse en distintos ámbitos, lo que implica elegir entre concurrencia y sobrecarga:

  • Los bloqueos a nivel de fila permiten una gran concurrencia, pero requieren más recursos para gestionarse.
  • Los bloqueos de página o de tabla son más baratos de controlar, pero bloquean a más transacciones.

Algunos motores escalan los bloqueos de fila a bloqueos de tabla cuando una transacción afecta a demasiadas filas (escalada de bloqueos). Saberlo explica por qué una operación UPDATE masiva puede bloquear de repente a todos.

MVCC: el enfoque de las instantáneas

MVCC (control de concurrencia mediante versiones múltiples) es la forma en que Postgres, Oracle e InnoDB evitan la mayoría de los bloqueos de lectura. En lugar de bloquear, la base de datos mantiene varias versiones de cada fila.

La principal ventaja, y una frase muy apreciada en las entrevistas, es la siguiente: los lectores no bloquean a los escritores y los escritores no bloquean a los lectores.

Cada transacción ve una instantánea coherente correspondiente a un momento determinado, mientras que los escritores crean nuevas versiones de las filas en lugar de sobrescribirlas directamente.

Cómo funciona MVCC internamente

Cuando se actualiza una fila, MVCC escribe una nueva versión y conserva la anterior. Cada versión contiene metadatos del identificador de la transacción (en Postgres, xmin y xmax) que indican cuándo pasó a ser visible y cuándo fue reemplazada.

La instantánea de una transacción determina qué versión ve. Las versiones antiguas que ninguna transacción puede seguir viendo se convierten en tuplas muertas, que posteriormente recupera un proceso de limpieza. En Postgres, ese proceso es VACUUM; no ejecutarlo provoca bloat de tablas, una pregunta habitual como seguimiento.

Bloqueos frente a MVCC: ventajas y desventajas

Resuma la comparación con claridad:

  • Bloqueos puros: corrección sencilla, pero los lectores y escritores se bloquean entre sí, lo que perjudica la concurrencia.
  • MVCC: excelente concurrencia de lectura y ausencia de bloqueos de lectura, pero a cambio requiere almacenamiento de versiones y limpieza (VACUUM, bloat), y sigue necesitando bloqueos para los conflictos entre escrituras.

Incluso los motores que usan MVCC aplican bloqueos al escribir: dos transacciones que actualizan la misma fila deben serializarse. MVCC elimina la contención entre lectores y escritores, no la que existe entre escritores.

Bloqueo optimista y columnas de versión

Además del MVCC del motor, las aplicaciones suelen añadir bloqueo optimista para operaciones de lectura, modificación y escritura que abarcan sesiones de usuario prolongadas. Se añade una columna version, se lee su valor y, al actualizar, se exige que la versión coincida y se incrementa.

Si otra transacción actualizó primero la fila, la versión ya no coincide, no se modifica ninguna fila y el código sabe que debe volver a cargar los datos e intentarlo de nuevo. No se mantienen bloqueos mientras el usuario piensa, por lo que la concurrencia sigue siendo alta. A los entrevistadores les gusta este enfoque para la pregunta «¿cómo gestionaría que dos usuarios editaran el mismo registro?».

-- read: SELECT id, data, version FROM items WHERE id = 1;  -- version = 7
UPDATE items
  SET data = 'new value', version = version + 1
  WHERE id = 1 AND version = 7;
-- if rows affected = 0, someone else changed it: reload and retry

Comprobación rápida

Compruebe que entiende la idea clave de MVCC.

Repaso: bloqueos, interbloqueos y MVCC

Ya puede explicar los mecanismos que sustentan el aislamiento:

  • Los bloqueos compartidos y exclusivos coordinan el acceso; SELECT FOR UPDATE adquiere bloqueos de escritura explícitos.
  • Los interbloqueos son ciclos de bloqueos; el motor cancela una víctima y un orden coherente de los bloqueos evita la mayoría de ellos.
  • MVCC conserva versiones de las filas para que los lectores y escritores no se bloqueen entre sí, a cambio de requerir limpieza (VACUUM, bloat).

Combine estos mecanismos con los niveles de aislamiento y las anomalías de las lecciones anteriores, y podrá abordar una entrevista completa sobre concurrencia de principio a fin.

Preguntas frecuentes

¿La lección «Interbloqueos, bloqueos y MVCC» es gratis?

Sí — el texto completo de «Interbloqueos, bloqueos y MVCC» 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 SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Interbloqueos, bloqueos y MVCC»?

Cómo evitan las bases de datos los conflictos y cuáles son las ventajas y desventajas de los bloqueos frente a las instantáneas. Practicas SQL Interview Prep 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 SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep 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 «Interbloqueos, bloqueos y MVCC»?

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 SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep 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. Explicación de las propiedades ACID
  2. Los cuatro niveles de aislamiento
  3. Lecturas sucias, no repetibles y fantasma
  4. Interbloqueos, bloqueos y MVCC
← Volver a SQL Interview Prep