Control de concurrencia por bloqueo

Bloqueo: El Semáforo de las Transacciones

Imagina una base de datos como una biblioteca muy concurrida. Para evitar que dos personas modifiquen el mismo libro al mismo tiempo y causen un caos, la biblioteca implementa un sistema de reservas: si quieres modificar un libro, debes reservarlo primero. Nadie más podrá modificar ese libro mientras tú lo tengas reservado.

En las bases de datos, los bloqueos cumplen una función similar. Son mecanismos que permiten a un sistema de gestión de bases de datos (SGBD) controlar el acceso a los datos, evitando que múltiples transacciones modifiquen los mismos datos simultáneamente y causen inconsistencias.

Tipos de Bloqueos

Existen diferentes tipos de bloqueos, cada uno con características y propósitos distintos:

  • Bloqueo compartido (S): Permite que múltiples transacciones lean el mismo dato de forma simultánea. Es como si varias personas pudieran leer el mismo libro al mismo tiempo.
  • Bloqueo exclusivo (X): Solo permite que una transacción acceda al dato, ya sea para leerlo o modificarlo. Es como si una persona tuviera el libro reservado para estudiarlo o modificarlo.

¿Cómo funciona el bloqueo?

  1. Solicitud de bloqueo: Cuando una transacción necesita acceder a un dato, solicita un bloqueo al SGBD.
  2. Concesión o denegación: Si el bloqueo solicitado es compatible con los bloqueos ya existentes, se concede. De lo contrario, la transacción debe esperar hasta que se liberen los bloqueos incompatibles.
  3. Liberación del bloqueo: Una vez que la transacción ha terminado de utilizar el dato, libera el bloqueo, permitiendo que otras transacciones puedan solicitar acceso.

Ejemplo Práctico

Imagina dos transacciones, T1 y T2, que quieren actualizar el saldo de una cuenta bancaria.

  • T1: Lee el saldo actual y resta 100 euros.
  • T2: Lee el saldo actual y suma 50 euros.

Sin bloqueo: Si ambas transacciones se ejecutan simultáneamente sin ningún tipo de control, podrían leer el mismo saldo inicial y luego actualizarlo, lo que llevaría a un resultado incorrecto.

Con bloqueo: Si se utiliza un bloqueo exclusivo, solo una transacción podrá acceder al registro de la cuenta a la vez. Por ejemplo, si T1 obtiene el bloqueo exclusivo primero, T2 tendrá que esperar hasta que T1 libere el bloqueo para poder actualizar el saldo.

Ventajas del Bloqueo

  • Garantiza la consistencia de los datos: Evita que se produzcan actualizaciones concurrentes que puedan dañar la integridad de la base de datos.
  • Facilidad de implementación: Es una técnica relativamente sencilla de implementar y comprender.

Desventajas del Bloqueo

  • Deadlocks: Pueden producirse situaciones en las que dos o más transacciones se bloquean mutuamente, esperando que la otra libere un recurso.
  • Bajo rendimiento: Un uso excesivo de bloqueos puede reducir el rendimiento del sistema, ya que las transacciones pueden tener que esperar mucho tiempo para obtener los bloqueos que necesitan.

Algoritmo General para Bloqueo:

  1. Solicitud de Bloqueo:

    • Una transacción solicita un bloqueo sobre un recurso (por ejemplo, una fila en una tabla).
    • El tipo de bloqueo puede ser compartido (S) o exclusivo (X).
  2. Verificación de Compatibilidad:

    • El sistema verifica si el bloqueo solicitado es compatible con los bloqueos ya existentes sobre el recurso.
    • Si es compatible, se concede el bloqueo.
    • Si no es compatible, la transacción entra en estado de espera hasta que se liberen los bloqueos incompatibles.
  3. Concesión de Bloqueo:

    • Si el bloqueo es compatible, se asigna a la transacción y se actualiza la tabla de bloqueos.
  4. Utilización del Recurso:

    • La transacción puede acceder y modificar el recurso mientras tenga el bloqueo.
  5. Liberación de Bloqueo:

    • Una vez que la transacción ha terminado de utilizar el recurso, libera el bloqueo.
  6. Notificación a las Transacciones en Espera:

    • El sistema notifica a las transacciones que estaban esperando el bloqueo, para que puedan volver a solicitarlo.

Ejemplo en pseudo-código:

función solicitar_bloqueo(transacción, recurso, tipo_bloqueo)
    si tipo_bloqueo es compatible con los bloqueos existentes sobre recurso
        asignar_bloqueo(transacción, recurso)
    sino
        poner_transacción_en_espera(transacción)
    fin_si
fin_función

función liberar_bloqueo(transacción, recurso)
    eliminar_bloqueo(transacción, recurso)
    notificar_transacciones_en_espera(recurso)
fin_función

Tipos de Bloqueo:

  • Bloqueo compartido (S): Permite que múltiples transacciones lean el mismo dato de forma simultánea.
  • Bloqueo exclusivo (X): Solo permite que una transacción acceda al dato, ya sea para leerlo o modificarlo.

Tabla de Compatibilidad de Bloqueos:

Bloqueo ExistenteBloqueo SolicitadoCompatible
SS
SXNo
XSNo
XXNo


Ejemplo de Uso:

// Transacción T1 quiere leer una fila
solicitar_bloqueo(T1, fila1, S)

// Transacción T2 quiere modificar la misma fila
solicitar_bloqueo(T2, fila1, X)  // T2 tendrá que esperar

// T1 termina de leer y libera el bloqueo
liberar_bloqueo(T1, fila1)

// Ahora T2 puede obtener el bloqueo y modificar la fila
solicitar_bloqueo(T2, fila1, X)  // Se concede
// ...
liberar_bloqueo(T2, fila1)


Comentarios

Entradas más populares de este blog

Procedimientos almacenados, manejo de excepciones

Procedimiento almacenado, manejo de transacciones

Procedimiento almacenado recuperación de información