Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Resumen
El objetivo de los métodos de control de concurrencia es garantizar la no inferencia o la
propiedad de aislamiento de transacciones que se ejecutan de manera concurrente. Los distintos
objetivos atacan el problema garantizando que las transacciones se ejecuten en un plan que sea
serializable, es decir, que el resultado sea equivalente a el resultante de ejecutar un plan en serie.
Este documento analiza los tres grandes grupos de métodos y protocolos (de bloqueo, de
marcas de tiempo y optimistas), haciendo especial énfasis en las ventajas e inconvenientes de usar
unos u otros.
Contenidos
1. Protocolos basados en técnicas de bloqueo
1. Bloqueos binarios
1. Usando bloqueos binarios
2. Bloqueos de lectura/escritura
3. Protocolo de bloqueo en dos fases
1. Bloqueo en dos fases básico, conservador, estricto y riguroso
1. Conservador o estático
2. Estricto
3. Riguroso
2. Problemas del bloqueo en dos fases: Interbloqueo y espera indefinida
1. Protocolos de prevención de interbloqueo
2. Detección del interbloqueo
3. Espera indefinida
1
Métodos de control de concurrencia
Cabe destacar antes de comenzar el estudio de los protocolos basados en bloqueos que son
los más utilizados por los SGBD comerciales. Los demás tienen una alcance más teórico que
práctico.
Un bloqueo es una variable asociada a un elemento de datos de la base de datos, usada para
restringir las operaciones que se pueden aplicar sobre él. Existen varios tipos de bloqueo: binarios
(de propiedades limitadas), compartidos, exclusivos (usados en la práctica), y bloqueos de
certificación.
Las operaciones sobre bloqueos se deben implementar como secciones críticas, es decir, de
forma indivisible; el SGBD no deberá alternar sus instrucciones con otras.
Bloqueos binarios
Se caracterizan por tener dos valores posibles; bloqueado y desbloqueado. Cada elemento de
la base de datos tiene un bloqueo distinto. El bloqueo señala si una transacción está operando sobre
el elemento o está libre para que se pueda operar con él. De esta manera se impide que dos o más
transacciones estén operando sobre un mismo elemento al mismo tiempo.
La implementación de un bloqueo binario es simple; basta con un vector de la siguiente
forma: <referencia al dato bloqueado, booleano, referencia a la transacción que lo bloquea> donde
el booleano es en sí el indicador del bloqueo.
Bloqueos de lectura/escritura
Son una ampliación de los bloqueos binarios. Tenemos que el bloqueo puede tener tres
posibles posiciones: libre, bloqueado para lectura, y bloqueado para escritura. De esta forma, más de
una transacción puede tener un mismo elemento de datos bloqueado para lectura, pero sólo una para
escritura. Si una transacción quiere escribir en ese elemento, habrá de esperar a que el bloqueo
quede libre (cualquiera que sea el tipo de bloqueo), y a continuación, bloquearlo para escritura. Si
quiere leer, sólo tendrá que esperar si el elemento está bloqueado para escritura. Se dice por tanto,
que el bloqueo de lectura es compartido y el de escritura exclusivo. Tendremos por tanto tres
operaciones; bloquear_escritura(X), bloquear_lectura(X) y desbloquear(X).
2
Salvador Jesús Romero Castellano
El sistema debe hacer cumplir las siguientes reglas para usar los bloqueos de
lectura/escritura:
Las reglas 4 y 5 se pueden relajar, admitiendo que una transacción que tenga bloqueado un
elemento en modo lectura, lo pueda bloquear en modo escritura, si no existe ninguna otra
transacción que lo tenga bloqueado. Así mismo, si lo tiene bloqueado en escritura, puede relajar el
bloqueo a lectura.
Conservador o estático
Requiere que una transacción bloquee todos los elementos a los que tendrá acceso antes de
3
Métodos de control de concurrencia
comenzar a ejecutarse. Una vez bloqueados, no habrá conversión de bloqueos de lectura a escritura.
Si no es posible bloquearlos todos, la transacción no bloqueará nada y esperará a poder bloquear
todos los elementos necesarios en su totalidad.
Su principal ventaja es que no sólo garantiza la seriabilidad, sino que evita el interbloqueo
de transacciones.
Como principal inconveniente señalaremos que, en la práctica, es muy difícil saber qué
elementos serán necesarios durante la transacción antes de que esta comience, si no imposible.
También es interesante destacar que, al tener que esperar a poder bloquear todos los
elementos que la transacción necesite, este protocolo reduce la concurrencia.
Estricto
La transacción no libera ninguno de sus bloqueos de escritura antes de confirmarse o
abortar.
Este tipo de bloqueo garantiza planes estrictos en cuanto a recuperabilidad (recuperable es
un plan que, una vez confirmada la transacción, no será necesaria deshacerla). Sin embargo, puede
sufrir interbloqueos.
Riguroso
Es una versión más restrictiva del estricto. Similar al anterior, pero además tampoco libera
los bloqueos de lectura. Es más fácil de implementar.
1. Exclusión mutua. Cada elemento está bloqueado por una transacción, o está libre.
2. Retención y espera: Una transacción que ya tiene elementos bloqueados puede solicitar un
elemento adicional, y esperar que se le asigne, sin devolver previamente ninguno de los
anteriores.
3. No apropiación: Sólo puede liberar un elemento la transacción que lo tiene asignado; no se lo
puede quitar otra transacción que tenga mayor prioridad, ni el SGBD.
4. Espera circular: Existe una cadena circular, compuesta por dos transacciones o más, y otros
tantos elementos intercalados, de manera que cada proceso está esperando que se le asigne un
elemento, el cual, a su vez, está asignado al siguiente proceso de la cadena.
El tratamiento del interbloqueo está orientado bien a prevenirlo, bien a detectarlo y evitarlo.
4
Salvador Jesús Romero Castellano
prevención en casi todos, hace que no se haga nada para tratarlo, circunstancia con la que tenemos
que enfrentarnos a menudo, y que solemos resolver matando un programa.
Otra solución más sencilla es el uso de tiempos limitados, que presupone que una transacción que
lleve en espera un tiempo superior a un tiempo predefinido se encuentra bloqueada, y se procede a
su eliminación.
Espera indefinida
Este problema tiene lugar cuando una transacción no puede continuar durante un periodo
indeterminado mientras otras transacciones del sistema continúan con normalidad. La solución a
5
Métodos de control de concurrencia
este problema pasa por tener una planificación justa, que impida que algunas de las transacciones
'mueran de inanición'.
Esto es una diferencia fundamental conforme a los métodos anteriores, en los que los planes
serializables lo eran a algún plan serial que se pueda construir con los protocolos de bloqueo (¡que
no eran todos los planes seriales posibles!). En este caso sabemos a qué plan serial se
correspondería el plan serializable resultante de aplicar ordenación por marcas de tiempo.
Ordenación básica
Consiste en lo siguiente:
Si alguna de las marcas son mayores que la marca de T, significa que una transacción
posterior a T escribió o leyó de X, y por tanto, que T usara el elemento X estaría en contra del orden
por antigüedad de transacción; la transacción más vieja debería escribir en X antes de que la joven
usara este elemento.
6
Salvador Jesús Romero Castellano
En esta ocasión, dado que lo que queremos hacer, leer, no afecta a otras transiciones, sólo
debe preocuparnos que una transacción más joven haya escrito en la variable en cuestión.
Al abortar una transacción, se vuelve a introducir en el sistema, con una nueva marca de
tiempo, para probar suerte como una transacción nueva.
Inconvenientes:
• Una transacción puede verse sometida a un reinicio cíclico.
• Si existe mucha interacción, puede ser muy costoso, al tener que deshacer muchas veces.
• Se puede producir una restauración en cascada: Al deshacer una transacción T1, cualquier
transacción T2 que haya utilizado un valor escrito por T1 habrá de deshacerse también, y así
sucesivamente.
7
Métodos de control de concurrencia
La principal ventaja de este método salta a la vista; no hay operación de lectura rechazada,
que provoque un reinicio de la transacción.
El principal inconveniente también cae por su propio peso. El mantener varias versiones de
un elemento puede llegar a resultar costoso. En el caso peor, la base de datos puede degenerar en
una base de datos temporal, que sigue la pista a todos los cambios y los momentos en los que
ocurrieron. Cabe destacar también que en este método, abortar una transacción puede provocar una
restauración en cascada, ya comentada antes.
8
Salvador Jesús Romero Castellano
exclusivo respecto a los otros dos. Una vez lo obtiene, el valor de X pasa a ser el de X', con lo que a
partir de ese momento es visible para todas las transacciones.
La novedad de este método con respecto al bloqueo en dos fases ya visto es que permite la
lectura a mismo tiempo que la escritura. Sin embargo, una transacción deberá esperar a confirmarse
hasta tener los bloqueos de certificación de todos los elementos que ha modificado.
Este esquema evita el aborto en cascada, ya que siempre se leen versiones confirmadas de X.
Sin embargo, si permitimos que un bloqueo se convierta en un bloqueo de escritura, tal como ya
vimos anteriormente para la versión simple de este bloqueo, se puede producir un interbloqueo.
Con esto tenemos que los protocolos de bloqueo optimistas tienen tres fases bien
diferenciadas:
• Fase de lectura/ejecución: En ella las transacciones leen cuantos elementos necesiten de la base
de datos, pero realizan las modificaciones en un espacio particular, como ya hemos señalado.
• Fase de certificación/validación: Se verifica que los resultados de la transacción no violan la
seriabilidad. De ser así (el resultado no es correcto), la transacción reinicia (como las
modificaciones eran en un espacio aparte de variables, no hace falta deshacer. Simplemente se
descartan estas variables).
• Fase de escritura/confirmación: Llegados a este punto, aplicamos las actualizaciones de la
transacción a la base de datos.
Este protocolo necesita de marcas de tiempo de transacciones, guardar las horas de inicio y
terminación de al menos una de las tres fases y además requiere que el sistema mantenga control
sobre los conjuntos de lectura y escritura de cada transacción.
En la fase de validación de la transacción T, el protocolo comprueba que que T no interfiere
en ninguna transacción confirmada ni en cualquier otra que actualmente esté en su fase de
validación. La fase de validación consiste por tanto en, para toda otra transacción T', comprobar que
se cumplan alguna de estas condiciones:
1. La transacción T' completa su fase de escritura antes de que T inicie su fase de lectura.
2. T inicia su fase de lectura después de que T' complete su fase de escritura y el conjunto de
lectura de T no tiene elementos en común con el conjunto de escritura de T'.
3. Ni el conjunto de lectura ni el conjunto de escritura de T tienen elementos en común con el
conjunto de lectura de T', y T' completa su fase de lectura antes de que T complete su fase de
lectura.
9
Métodos de control de concurrencia
El control optimista es más rápido y permite mayor grado de paralelismo, al menos, con
cargas de trabajo bajas o medias. Para cargas altas, aumenta la probabilidad de que se produzca un
conflicto, y las cancelaciones e intentos sucesivos causan un incremento apreciable del trabajo.
10