DBMS - Control de concurrencia
En un entorno de multiprogramación donde se pueden ejecutar múltiples transacciones simultáneamente, es muy importante controlar la concurrencia de transacciones. Contamos con protocolos de control de concurrencia para garantizar la atomicidad, el aislamiento y la serialización de las transacciones concurrentes. Los protocolos de control de simultaneidad se pueden dividir en dos categorías:
- Protocolos basados en bloqueo
- Protocolos basados en sellos de tiempo
Protocolos basados en bloqueo
Los sistemas de bases de datos equipados con protocolos basados en bloqueos utilizan un mecanismo mediante el cual ninguna transacción no puede leer o escribir datos hasta que adquiere un bloqueo adecuado. Las cerraduras son de dos tipos:
Binary Locks- Un bloqueo en un elemento de datos puede estar en dos estados; está bloqueado o desbloqueado.
Shared/exclusive- Este tipo de mecanismo de bloqueo diferencia las cerraduras en función de sus usos. Si se adquiere un bloqueo en un elemento de datos para realizar una operación de escritura, es un bloqueo exclusivo. Permitir que más de una transacción escriba en el mismo elemento de datos llevaría a la base de datos a un estado incoherente. Los bloqueos de lectura se comparten porque no se cambia ningún valor de datos.
Hay cuatro tipos de protocolos de bloqueo disponibles:
Protocolo de bloqueo simplista
Los protocolos simplistas basados en bloqueos permiten que las transacciones obtengan un bloqueo en cada objeto antes de que se realice una operación de "escritura". Las transacciones pueden desbloquear el elemento de datos después de completar la operación de "escritura".
Protocolo de bloqueo previo a la reclamación
Los protocolos de reclamación previa evalúan sus operaciones y crean una lista de elementos de datos en los que necesitan bloqueos. Antes de iniciar una ejecución, la transacción solicita al sistema todos los bloqueos que necesita de antemano. Si se otorgan todos los bloqueos, la transacción se ejecuta y libera todos los bloqueos cuando todas sus operaciones terminan. Si no se otorgan todos los bloqueos, la transacción se revierte y espera hasta que se otorguen todos los bloqueos.
Bloqueo de dos fases 2PL
Este protocolo de bloqueo divide la fase de ejecución de una transacción en tres partes. En la primera parte, cuando la transacción comienza a ejecutarse, busca permiso para los bloqueos que requiere. La segunda parte es donde la transacción adquiere todos los bloqueos. Tan pronto como la transacción libera su primer bloqueo, comienza la tercera fase. En esta fase, la transacción no puede exigir nuevos bloqueos; solo libera los bloqueos adquiridos.
El bloqueo de dos fases tiene dos fases, una es growing, donde todas las cerraduras están siendo adquiridas por la transacción; y la segunda fase se está reduciendo, donde se liberan los bloqueos mantenidos por la transacción.
Para reclamar un bloqueo exclusivo (escritura), una transacción primero debe adquirir un bloqueo compartido (lectura) y luego actualizarlo a un bloqueo exclusivo.
Bloqueo estricto de dos fases
La primera fase de Strict-2PL es la misma que 2PL. Después de adquirir todos los bloqueos en la primera fase, la transacción continúa ejecutándose normalmente. Pero a diferencia de 2PL, Strict-2PL no libera un bloqueo después de usarlo. Strict-2PL retiene todos los bloqueos hasta el punto de compromiso y libera todos los bloqueos a la vez.
Strict-2PL no tiene aborto en cascada como lo hace 2PL.
Protocolos basados en marcas de tiempo
El protocolo de concurrencia más utilizado es el protocolo basado en marcas de tiempo. Este protocolo utiliza la hora del sistema o un contador lógico como marca de tiempo.
Los protocolos basados en bloqueos administran el orden entre los pares en conflicto entre las transacciones en el momento de la ejecución, mientras que los protocolos basados en marcas de tiempo comienzan a funcionar tan pronto como se crea una transacción.
Cada transacción tiene una marca de tiempo asociada y el orden está determinado por la antigüedad de la transacción. Una transacción creada a la hora del reloj 0002 sería más antigua que todas las demás transacciones posteriores. Por ejemplo, cualquier transacción 'y' que ingrese al sistema en 0004 es dos segundos más reciente y se le daría prioridad a la anterior.
Además, cada elemento de datos recibe la última marca de tiempo de lectura y escritura. Esto le permite al sistema saber cuándo se realizó la última operación de "lectura y escritura" en el elemento de datos.
Protocolo de pedido de marca de tiempo
El protocolo de ordenación de marcas de tiempo garantiza la serialización entre transacciones en sus operaciones de lectura y escritura en conflicto. Es responsabilidad del sistema de protocolo que el par de tareas en conflicto se ejecute de acuerdo con los valores de marca de tiempo de las transacciones.
- La marca de tiempo de la transacción T i se denota como TS (T i ).
- La marca de tiempo de lectura del elemento de datos X se indica mediante la marca de tiempo R (X).
- La marca de tiempo de escritura del elemento de datos X se indica con la marca de tiempo W (X).
El protocolo de pedido de marca de tiempo funciona de la siguiente manera:
If a transaction Ti issues a read(X) operation −
- Si TS (Ti) <W-marca de tiempo (X)
- Operación rechazada.
- Si TS (Ti)> = W-marca de tiempo (X)
- Operación ejecutada.
- Se actualizaron todas las marcas de tiempo de los elementos de datos.
If a transaction Ti issues a write(X) operation −
- Si TS (Ti) <R-marca de tiempo (X)
- Operación rechazada.
- Si TS (Ti) <W-marca de tiempo (X)
- Operación rechazada y Ti retrocedió.
- De lo contrario, operación ejecutada.
Regla de escritura de Thomas
Esta regla establece que si TS (Ti) <W-timestamp (X), la operación se rechaza y T i se revierte.
Las reglas de pedido de marca de tiempo se pueden modificar para que la vista de programación sea serializable.
En lugar de hacer que T i retroceda, se ignora la operación de 'escritura' en sí.