Concurrencia en los SMDB
La Concurrencia en los SMBD son propiedades que permiten que muchos procesos sean ejecutados al mismo tiempo a fin de evitar errores al momento de ejecutar diferentes transacciones. ORACLE utiliza un sistema multiversion que consiste en permitir el acceso concurrente a los datos. Así mismo, la multiversion en Oracle está basado en marcas de tiempo es decir cuando se realiza una transacción y se desea acceder a un ítem, automáticamente se compara la marca de tiempo de la transacción con las marcas de tiempo de las demás versiones del ítem.
Los
sistemas de bases de datos, según
el número de usuarios que
pueden utilizarlos de forma concurrente, se clasifican en sistemas monousuario y multiusuario.
Razones para permitir la concurrencia:
–Aumentar
la productividad: número de transacciones ejecutadas por minuto.
–Aumentar
la utilización de la CPU (menos tiempo ociosa) y Control del disco.
–Reducir
el tiempo medio de respuesta de transacciones (las ‘pequeñas’ no esperan a las
‘grandes’)
Problemas clásicos de concurrencia:
- Modificación perdida
–T1 y T2 que acceden a los mismos datos, tienen
sus operaciones intercaladas de
modo que hacen incorrecto el valor de algún dato
T1
leer_elemento(X);
X:=
X-N;
escribir_elemento(X);
leer_elemento(Y);
Y:=Y+N;
escribir_elemento(Y);
T2
leer_elemento(X);
X:=
X+M;
escribir_elemento(X);
Observación: El
elemento X tiene un valor incorrecto porque su
actualización por T1 se ‘perdió’ (se sobreescribió)
- Modificación temporal
–T1
actualiza un elemento X de
la BD y luego falla, pero antes de que se restaure el valor
original de X, T2 tiene acceso al «valor temporal» de X
T1
leer_elemento(X);
X:=
X-N;
escribir_elemento(X);
leer_elemento(Y);
… Observación:T1
falla y debe devolver a X su antiguo
valor; pero mientras, T2 ha leído el valor ‘temporal’ incorrecto de X (dato sucio) .
T2
leer_elemento(X);
X:=
X+M;
escribir_elemento(X);
- Totalización incorrecta
–Otra transacción T3 calcula una función agregada de resumen
sobre varios registros (suma
las plazas reservadas para todos los vuelos), mientras otras transacciones, como T1, actualizan dichos registros: puede que T3 considere unos registros antes de ser
actualizados y otros después.
T1
leer_elemento(X);
X:=
X-N;
escribir_elemento(X);
leer_elemento(Y);
Y:=Y+N;
escribir_elemento(Y)
T3
suma:=0;
leer_elemento(A);
suma:=
suma+A;
…
…
…
leer_elemento(X); Observación: T3
lee X después de restar N, pero lee Y antes de sumar N, así que el resultado es un
resumen incorrecto (discrepancia de N)
suma:=
suma+X;
leer_elemento(Y);
suma:=
suma+Y;
…
…
…
- Lectura no repetible
T4
lee un elemento X
dos veces y otra transacción, como T1, modifica dicho X entre las dos lecturas: T4 recibe diferentes valores para el mismo
elemento.
T1
leer_elemento(X);
X:=
X-N;
escribir_elemento(X);
leer_elemento(Y);
Y:=Y+N;
escribir_elemento(Y);
T4
leer_elemento(X);
… Observación: T4
lee X antes de restar N
leer_elemento(X);
… Observación: T4
lee X después de restar N
En ORACLE los fenómenos prevenibles son:
- Lectura sucia
- Lectura no repetible (borrosa)
- Lectura fantasma
Las transacciones de actualización realizan un bloqueo de dos fases:
- Riguroso: es decir, mantienen todos los bloqueos hasta el final de la transacción. Así, se pueden secuenciar según su orden de terminación. Cada elemento de datos tiene una única marca temporal. La marca temporal no es en este caso una marca temporal basada en un reloj real, sino que es un contador, que se denominacontador_mt, que se incrementa durante el procesamiento del compromiso.
- En cuanto a los lectores (transacciones de lectura): se les asigna una marca temporal leyendo el valor actual de contador_mt antes de que comiencen su ejecución; para realizar las lecturas según el protocolo de ordenación por marcas temporales multiversión. Así, cuando una transacción de solo lectura T, ejecuta FIND(R), el valor que se devuelve es el contenido de la versión con la mayor marca temporal que MT (T).
Algoritmo multiversión
Este algoritmo consiste en ir guardando varias versiones del mismo
dato (gránulo) : se conservan los valores antiguos de los gránulos que
se han actualizado.
Lectura:Cuando una Transacción necesita leer algún gránulo, se elige una versión adecuada para mantener la seriabilidad de la planificación, si es posible.
Escritura:Cuando una Transacción escribe un gránulo, escribe una nueva versión de ese gránulo, conservándose además la versión anterior.
Desventaja: requiere más almacenamiento que los anteriores.
Muchas veces estas versiones se aprovechan para la recuperación.
Abortar transacciones: se aborta la transacción que provocó el
conflicto (la más reciente) y se le asigna una nueva marca de tiempo.
Este algoritmo se basa en el concepto de la seriabilidad por vistas.
Estructuras usadas por Oracle para su implementación
El control de concurrencia multiversión de Oracle difiere de los mecanismos de concurrencia usados por la mayoría de los fabricantes de bases de datos. Para las consultas de sólo lectura, se proporcionan instantáneas consistentes en lectura, que son vistas de la base de datos tal como existía en cierto momento, conteniendo todas las actualizaciones que se comprometieron hasta ese momento y no el resto. Por ello, no se utilizan los bloqueos de lectura y las consultas de sólo lectura no interfieren con otra actividad de la base de datos en términos de bloqueos (básicamente, el protocolo de bloqueo multiversión en dos fases).
Se soporta además la consistencia de lectura en un nivel de instrucción y transacción.
Al comienzo de la ejecución de una instrucción o transacción, Oracle determina el número de cambios del sistema actual (SCN – System Change Number). SCN actúa como marca temporal.
Además, Oracle emplea este modelo de concurrencia como base para la característica Flashback Query, soporta dos niveles de aislamiento ANSI/ISO con compromiso se lectura y secuenciable y utiliza un bloqueo en el nivel de las filas, aunque a veces también se emplea bloqueo a nivel de tabla (con el fin de asegurar la consistencia).
También detecta los interbloqueos automáticamente y los resuelve retrocediendo una de las transacciones involucradas en el interbloqueo. Por último, comentar que Oracle también soporta transacciones autónomas que son transacciones independientes generadas con otras transacciones.
PROTOCOLO DE BLOQUEO DE DOS FASES
Protocolo que asegura la secuencialidad es el protocolo de bloqueo de dos fases. Este protocolo exige que cada transacción realice las peticiones de bloqueo y desbloqueo de dos fases.
1.- Fase de crecimiento.- Una transacción puede obtener bloqueos pero no puede liberarlos.
2.- Fase de decrecimiento.- Una transacción puede liberar bloqueos pero no puede obtener ninguno nuevo.
Inicialmente una transacción está en la fase de crecimiento. La transacción adquiere los bloqueos que necesite. Una vez que la transacción entra un bloqueo, entra en la fase de crecimiento como puede alcanzar peticiones de bloqueo.
Se puede mostrar que el protocolo de bloqueo de dos fases asegura secuencialidad en cuanto a conflictos. Considérese cualquier transacción. El punto de la planificación en el cual la transacción obtiene el bloqueo final (el final de la fase de crecimiento) se denomina punto de bloqueode la transacción.
El protocolo de bloqueo de dos fase no asegura la ausencia de interbloqueos.
Los retrocesos en cascada se pueden evitar por medio de una modificación del protocolo de dos fases que se denomina protocolo de bloque estricto de dos fases.
El protocolo de bloque estricto de dos fases exige que además de que el bloqueo sea de dos fases, una transacción debe poseer todos los bloqueos en modo exclusivo que tome hasta que dicha transacción no comprometida está bloqueado en modo exclusivo hasta que la transacción lea el dato..
Otra variante del bloqueo de dos fases es el protocolo de bloqueo riguroso de dos fases, el cual exige que se posean todos los bloqueos hasta que se comprometan la transacción. Se puede comprobar fácilmente que con el bloqueo riguroso de dos fases se pueden secuenciar las transacciones en el orden en que se comprometen.
Muchos sistemas de base de datos implementan tanto el bloqueo estricto como el bloqueo estricto de dos fases.

