Los bloqueos como solución al problema de la concurrencia
Una forma de controlar la concurrencia es hacer que cada transacción deba adquirir un derecho de acceso exclusivo a cada fragmento de datos que necesite modificar. A estos “derechos” se les denomina bloqueos.
Bloqueo binario
La forma más simple de bloquear es utilizar bloqueos binarios. En un bloqueo binario, cada transacción debe solicitar el bloqueo de cada fragmento de datos A
que vaya a utilizar antes de acceder a él (sea para leerlo o escribirlo), mediante una operación bloquear(A)
. Deberá liberar todos los bloqueos, mediante una operacióndesbloquear(A)
de modo que otras tareas puedan tomarlos.
Este sistema de bloqueos tiene una implementación muy simple, ya que solo requiere mantener una tabla que indica qué partes de los datos está bloqueada y por qué transacción.
Bloqueos de lectura y escritura
El sistema de bloqueos binarios es simple pero demasiado restrictivo, ya que no permite que dos transacciones que van a leer el mismo fragmento de datos A
lo hagan simultáneamente, cuando en realidad, no puede haber problemas en varios lectores simultáneos. Los bloqueos de lectura/escritura hacen más débil la restricción permitiendo la siguiente compatibilidad de bloqueos.
TABLA | LECTURA | ESCRITURA |
LECTURA | Compatible | Incompatible |
ESCRITURA | Incompatible | Incompatible |
En este caso, las operaciones que las transacciones deben realizar son tres: desbloquear(A)
ybloquear_para_lectura(A)
o bloquear_para_escritura(A)
.
Nótese que esas llamadas se implementan de diferentes formas en diferentes gestores de bases de datos. Por ejemplo, en MySQL, tanto las solicitudes de bloqueos como las liberaciones se realizan mediante una sola llamada del API de los gestores de almacenamiento:
store_lock(THD *thd, THR_LOCK_DATA **to, enum thr_lock_type lock_type)
Cada llamada a store_lock
utiliza el manejador de una tabla thd
concreta, y se indica la información de los datos a bloquear mediante la variable to
, y el tipo de bloqueo mediante lock_type
(el número de tipos definidos en MySQL es muy grande, ya que cubre todos los tipos de bloqueo que implementan los múltiples gestores de almacenamiento disponibles).
serializacion de los bloqueos de lectura/escritura
La serialización de las operaciones de lectura y escritura consiste en ordenar esas operaciones para un conjunto de transacciones concurrentes de modo que los resultados de las operaciones sean correctos. Por ejemplo, si tenemos las siguientes transacciones X e Y, puede darse la siguiente situación.
No hay comentarios:
Publicar un comentario