Professional Documents
Culture Documents
BASES DE DATOS II
ESCUELA ACADÉMICO PROFESIONAL DE INFORMÁTICA
UNIVERSIDAD NACIONAL DE TRUJILLO
Trujillo Perú
2006
Resumen. El presente artículo tiene como finalidad presentar una descripción de dos algoritmos
muy reconocidos para el Control de Concurrencia en el ámbito de las bases de Datos
Distribuidas, como son el algoritmo de Dos Fases Distribuidos y el de Estampas de Tiempo.
Dichos algoritmos cuentan con particularidades diferentes siendo el primero el bloqueo y el
estado de los mismos en dos fases, y del segundo, la sincronización de las operaciones en base a
marcas de tiempo. Dichos algoritmos son usados comercialmente, y son los más conocidos en el
ámbito de las Bases de Datos, de manera que su conocimiento es base para un buen estudio.
1. INTRODUCCIÓN
Con el mayo avance de las redes y los procesos distribuidos, las Ciencias de la Computación y en
especial el área de las Bases de Datos, tienen como menester incluir en ellas, propósito de mejora y
cambio. Bien conocido por todos es, que las Bases de datos son un punto importante en cualquier
estructura que se base en redes, pero la resolución de este problema no es tarea fácil, considerando que
las operaciones en una red son constantes y los usuarios exigen rapidez y eficiencia.
Así pues, una de las mayores preocupaciones es resolver el caso de la concurrencia. Esta concurrencia,
mucha o poca, viene a ser un problema a resolver, es por eso que se presentan algoritmos que permiten
ayudar en estos campos.
El presente documento presentará dos de los más importantes algoritmo de Control de Concurrencia,
ellos son el conocido Algoritmo de Bloqueo de Dos Fases(2PL) y el de Estampas de Tiempo(TS). Estos
algoritmos diferentes en su estructura, pretenden resolver cualquier dificultad en la ejecución de las
múltiples ejecuciones de las operaciones en un entorno de Bases de Datos Distribuidas.
El 2PL básicamente nos enfocará en un ámbito de bloqueos y desbloqueos que para algunos resulta
tedioso, pero que ciertamente es el más usado comercialmente, y el TS nos permitirá evitar estos
bloqueos, pero con el coste de necesitar mayores comparaciones y espacio auxiliar.
Los algoritmos presentados, resolverás los problemas en el Control de Concurrencia, pero eso no
equivale a decir que son los únicos, sino que simplemente son los más comerciales y conocidos. Dichos
algoritmos no solo mejorarán nuestro entendimiento en el estudio de las Bases de Datos Distribuidas
sino que permitirán obtener un mejor concepto del cómo y porqué se debe controlar la concurrencia.
1
Existe un Lock Manager en cada sitio. Cada uno es responsable de la gestión de bloqueos de los datos
que hay en ese nodo, además de ello implementa el protocolo de control de concurrencia ROWA (Read
One Write All), lo que significa que se puede utilizar cualquier copia de un dato para ser leído, pero para
escribir se deben ser bloqueadas todas las copias. [Según 1]
En los candados de dos fases distribuidos se presentan despachadores en cada nodo del sistema. Cada
despachador maneja las solicitudes de candados para los datos en ese nodo. Una transacción puede leer
cualquiera de las copias replicada del elemento x, obteniendo un candado de lectura en cualquiera de las
copias de x. La escritura sobre x requiere que se obtengan candados para todas las copias de x. La
comunicación entre los nodos que cooperan para ejecutar una transacción de acuerdo al protocolo de
candados distribuidos de dos fases se presenta en la Figura 2.1.1. Los mensajes de solicitud de candados
se envían a todos los administradores de candados que participan en el sistema. Las operaciones son
pasadas a los procesadores de datos por los administradores de candados. Los procesadores de datos
envía su mensaje de "fin de operación" al administrador de transacciones coordinador.[Según 2]
Se distribuye un gestor de bloqueo en cada nodo. Cada uno es responsable de la gestión de bloqueos de
los datos que contiene en ese nodo. El 2PL distribuido implementa una protocolo de control de replicas
Read-One-Write-All. Cualquier copia de un dato replicado puede ser usada para operaciones de lectura,
pero todas las copias deben ser bloqueadas para escritura antes que se puedan modificar. [Según 3]
En el 2PL distribuido, cada transacción puede consistir de varias subtransacciones corriendo en sitios
diferentes. Aquí se considera lo siguiente que una planificación es serializable si es equivalente en su
efecto sobre la base de datos a una planificación serial. Además de ello el Bloqueo de dos fases exige que
los bloqueos se dividan en dos fases: fase de bloqueo (crecimiento) y fase de desbloqueo (decrecimiento).
[Según 4]
2.2. CARACTERÍSTICAS
A continuación se presenta las características que describen la actuación del algoritmo. Vale aclarar que
dada la múltiple bibliografía, las siguientes aseveraciones podrían variar en cuanto a ciertas estructuras
usadas para realizar el algoritmo, pero ello no significa que los algoritmos sean diferentes, sino que se
presenta una perspectiva distinta siempre con el mismo modelo a seguir.
Cada una de las localidades mantiene su grafo de espera local. Estos grafos locales difieren de los antes
mencionados en que se agrega un nodo adicional, Tex al grafo. Existirá un arco Ti Tex en el grafo si
2
Ti está esperando un dato de otra localidad que esté siendo ocupado por cualquier otra transacción. De
manera similar, existirá un arco Tex Ti en el grafo si existe una transacción en otra localidad que esté
esperando un recurso que Ti esté esperando en ésta.
En el caso en que un grafo de espera local contiene un ciclo en el que no participa el nodo Tex , entonces
el sistema se encontrará en un estado de bloqueo. Sin embargo, la existencia de un ciclo que incluya a
Tex , implica la posibilidad de que se haya presentado un bloqueo. Para verificar si es así, es necesario
invocar un algoritmo distribuido de detección de bloqueos.
Suponemos que el grafo de espera de la localidad Li contiene un ciclo en el que participa el nodo Tex
.Este ciclo debe tener la forma:
lo que indica que la transacción Tk de Li está en espera para poder ocupar un dato de alguna otra
localidad, por ejemplo Lj . Al descubrir este ciclo, la localidad Li mandará un mensaje de detección de
bloqueos a la localidad Lj, el cual contendrá información referente al ciclo.
Tex T2 T4
T1 T2
T5 T3 Tex
T3
Localidad L1 Localidad L2
Cuando una localidad Lj recibe un mensaje de ese tipo, actualiza su grafo de espera local con la
información que acaba de obtener. Una vez hecho eso, determina si en el grafo de espera nuevo existe un
ciclo en el que no participe Tex. En caso afirmativo, se habrá detectado un bloqueo y se invocará un
esquema de recuperación apropiado. Si se descubre un ciclo en el que participe Tex, Lj transmitirá un
mensaje de detección de paralizaciones a la localidad correspondiente, por ejemplo Lk. La localidad Lk,
a su vez, repetirá el procedimiento. Así, después de un número finito de repeticiones, bien se habrá
detectado un boqueo, o se suspenderá el algoritmo de detección.
Para ilustrar lo anterior, examinamos los grafos de espera locales de la Figura 2.2.1. Suponemos que la
localidad L1 descubre el ciclo:
Tex T2 T3 Tex
Puesto que T3 está esperando un dato de la localidad L2, la localidad L1 transmitirá un mensaje de
detección de paralizaciones que describa este ciclo a la localidad L2. En el momento en que L2 reciba este
mensaje, actualizará su grafo de espera local para producir el grafo de espera de la Figura 2.2.2. Este
grafo contiene el ciclo:
T2 T3 T4 T2
3
que no incluye al nodo Tex. Por tanto, el sistema está en estado de bloqueo y es conveniente invocar un
esquema de recuperación apropiado.
Tex T2 T4
Localidad L2
T3
Es conveniente apuntar que el resultado habría sido el mismo si la localidad L2 y hubiera descubierto
primero el ciclo en su grafo de espera local y hubiera enviado el mensaje de detección de bloqueos a la
localidad L1. En el peor de los casos, las dos localidades descubrirían el ciclo aproximadamente al
mismo tiempo, con lo que se mandaría dos mensajes de detección de bloqueos, uno de L1 a L2 y otro de
L2 a L1. Esto conduce a una transferencia innecesaria de mensajes y un cierto retraso mientras se
actualizan los dos grafos de espera locales y se buscan ciclos en ambos grafos.
Para reducir el tráfico de mensajes, se asigna a cada transacción Ti un identificador único, denotado por
ID(Ti). En el caso en el que la localidad Lk descubra que su grafo de espera local contiene un ciclo en que
participa el nodo Tex y que tiene la forma
TexTk1Tk2…TknTex
sólo enviará un mensaje de detección de bloqueos a otra localidad si:
ID(Tkn)< ID(Tk1)
De no ser así, Lk continuará con su ejecución normal y dejará la responsabilidad de iniciar el algoritmo
de detección de bloqueos a alguna otra localidad.
Consideremos de nuevo los grafos de espera de la Figura 2.2.1 que mantienen las localidades L1 y L2.
Suponemos que:
ID(T1)< ID(T2)<ID(T3)≤ID(T4)
Suponemos que en ambas localidades descubren estos ciclos locales aproximadamente al mismo tiempo.
El ciclo en L1 tiene forma:
TexT2T3Tex
Tex T3T4T2Tex
4
Puesto que ID(T2)<ID(T3), la localidad L2 si enviará un mensaje de detección de bloqueos a la localidad
L1. Esta, al recibir el mensaje, actualizará su grafo de espera local, lo examinará para determinar si
contiene ciclos y descubrirá que el sistema está en estado de bloqueo. [Según 3]1
Aquí se presenta la caracterización desde otra óptica pero que permitirá obtener los mismos resultados.
Como se observa en la Figura 2.2.3. los elementos que aparecen en una misma línea podrían ocurrir
simultáneamente, o en cierto orden. Primero según el sitio S1, T1.1 debe preceder a T2.1 (T1 antes que
T2). Y por el otro lado, según el sitio S2, T2.2 debe preceder a T1.2 (T2 antes que T1). Por lo tanto, esta
planificación no es serializable.
El problema de las transacciones distribuidas es que no sólo debemos controlar que se realicen
localmente los bloqueos en dos fases, sino en la transacción global. Por lo tanto, ninguna subtransacción
Ti.n de una transacción Ti puede liberar un bloqueo si otra subtransacción Tj.m (de Tj) realizará después
un bloqueo (read-lock o write-lock). Ejemplo,
En la planificación 1 la transacción T1 viola este principio pues T1.1 libera el bloqueo sobre A1 antes que
T1.2 bloquee a A2.
En el bloqueo de dos fases estricto cada subtransacción debe informar a las otras subtransacciones de que ha
requerido todos los bloqueos. Luego de que todas las transacciones completaron su fase 1 (de bloqueo)
pueden continuar con las lecturas y escrituras para luego liberar los bloqueos (unlock). [Según 4]
En un sistema distribuido, cada transacción debe tener una estampilla de tiempo única para usar en la
decisión del orden de serializabilidad. Para la generación de estampillas únicas, en el modelo
1 La referencia a la bibliografía comprende desde el inicio del apartado 2.2. hasta la misma nota de referencia
5
distribuido: cada transacción tiene una estampilla de tiempo que surge de concatenar la estampilla de
tiempo local con el identificador de sitio.
El problema del modelo distribuido es que un sitio podría generar estampillas de tiempo a mayor
velocidad que otros sitios. En ese caso, las estampillas de tiempo generadas por el sitio más rápido serán
mayores que las generadas por otros sitios. Esto se evita si cada sitio utiliza un reloj lógico,
implementado mediante un contador que se incrementa cada vez que se genera una nueva estampilla de
tiempo local. Para sincronizar los relojes lógicos, se requiere que cada sitio Si avance su reloj lógico
cuando arriba una nueva transacción a ese sitio. [Según 4]
A diferencia de los algoritmos basados en candados, los algoritmos basados en estampas de tiempo no
pretenden mantener la seriabilidad por exclusión mutua. En lugar de eso, ellos seleccionan un orden de
serialización a priori y ejecutan las transacciones de acuerdo a ellas. Para establecer este ordenamiento, el
administrador de transacciones le asigna a cada transacción Ti una estampa de tiempo única ts( Ti )
cuando ésta inicia. Una estampa de tiempo es un identificador simple que sirve para identificar cada
transacción de manera única. Otra propiedad de las estampas de tiempo es la monoticidad, esto es, dos
estampas de tiempo generadas por el mismo administrador de transacciones deben ser igualemente
crecientes. Así, las estampas de tiempo son valores derivados de un dominio totalmente ordenado.
[Según 2]
El reloj local es incrementado por el timestamp del recientemente mensaje recibido. De esta manera
todos los relojes están avanzados hasta que ellos sean sincronizados. En el otro esquema dónde dos
timestamps idénticos no deben asignarse a dos transacciones, cada nodo asigna un timestamp a sólo
una transacción a cada tictac del reloj. Además el tiempo del reloj local se guarda en los bits de MSI y
los identificadores del nodo son guardados en los bits LSI. Dado que los identificadores de los nodos
son diferentes, este procedimiento asegurará un único timestamp.
Cuando los operaciones de dos transacciones entran en conflicto, se exige ser procesadas en el orden del
timestamp. Es fácil demostrar que el orden timestamp (TSO) produce historias serializables. Thomas ha
estudiado la exactitud y aplicación de este acercamiento y lo describió. Esencialmente cada nodo
procesa los funcionamientos contradictorios que el timestamp pida, cada relación de conflicto leer-
escribe y escribir-escribir está resuelta por el orden del timestamp. Por consiguiente todos los caminos
en la relación están en el orden del timestamp y, desde que todas las transacciones tienen un único
timestamp, se asume que ningún ciclo es posible en un gráfico que representa la transacción las
historias. [Según 5]
6
3.2. CARACTERÍSTICAS
Existen varias formas en que las estampas de tiempo se pueden asignar. Un método es usar un contador
global monotonicamente creciente. Sin embargo, el mantenimiento de contadores globales es un
problema en sistemas distribuidos. Por lo tanto, es preferible que cada nodo asigne de manera autónoma
las estampas de tiempos basándose en un contador local. Para obtener la unicidad, cada nodo le agrega
al contador su propio identificador. Así, la estampa de tiempo es un par de la forma
Note que el identificador de nodo se agrega en la posición menos significativa, de manera que, éste sirve
solo en el caso en que dos nodos diferentes le asignen el mismo contador local a dos transacciones
diferentes.
El administrador de transacciones asigna también una estampa de tiempo a todas las operaciones
solicitadas por una transacción. Más aún, a cada elemento de datos x se le asigna una estampa de tiempo
de escritura, wts(x), y una estampa de tiempo de lectura, rts(x); sus valores indican la estampa de tiempo
más grande para cualquier lectura y escritura de x, respectivamente.
Regla TO: dadas dos operaciones en conflicto, Oij y Okl, perteneciendo a las transacciones Ti y Tk,
respectivamente, Oij es ejecutada antes de Okl, si y solamente si, ts(Ti) < ts(Tk). En este caso Ti se dice ser
un transacción más vieja y Tk se dice ser una transacción más joven.
Dado este orden, un conflicto entre operaciones se puede resolver de la siguiente forma:
La acción de rechazar una operación, significa que la transacción que la envió necesita reiniciarse para
obtener la estampa de tiempo más reciente del dato e intentar hacer nuevamente la operación sobre el
dato.
7
Para prevenir la formación de interbloqueos se puede seguir la estrategia siguiente. Al hacer una
operación de escritura, no se modifican los valores actuales sino se crean nuevos valores. Así, puede
haber copias múltiples de un dato. Para crear copias únicas se siguen las siguientes estrategias de
acuerdo al tipo de operación de que se trate:
Una operación de lectura Ri(x) se traduce a una operación de lectura de x de una sola versión
encontrando la versión de x, digamos xv, tal que, ts(xv) es la estampa de tiempo más grande que tiene
un valor menor a ts(Ti).
Una operación de escritura Wi(x) se traduce en una sola version, Wi(xw), y es aceptada si el despachador
no ha procesado cualquier lectura Rj(xr), tal que,
ts(Ti) < ts(xr) < ts(Tj)
[Según 2]
En este algoritmo se guardan el momento (tiempo) en que se realizo alguna operación sobre la base de
datos. Estas estampas de tiempo son utilizadas en el vector de recepción.
El coordinador del sitio C (lugar donde se genera la transacción) ejecuta todas sus lecturas y escrituras
localmente, posteriormente se transmiten las operaciones a los otros sitios participantes en la operación,
junto con el vector de recepción con la entrada del sitio C actualizada con la estampa de tiempo de la
transacción, la ejecución del algoritmo se describe a continuación:
Cada sitio participante P compara su vector de recepción con la entrada del coordinador en el sitio P,
tendiendo los casos:
Sí la entrada del vector de recepción que acaba de recibir es igual al de su propio vector, el participante
puede realizar la escritura, ya que el sitio P ha ejecutado todas las acciones sobre el objeto o originadas
en C, y se le asigna la estampa de tiempo de P al vector de recepción en la entrada del sitio C.
Sí la comparación falla, es decir, la estampa de tiempo del participante no es igual a la del coordinador,
se cancelará la transacción en P, y no se aceptará ninguna escritura posterior para esa transacción en
particular.
En el caso de los que no pudieron participar o cancelaron el coordinador no recibe un acuse de esta
decisión. Por lo que en cada sitio se guarda un registro de reconciliación en donde se almacenan los
datos (objeto, sitio) en una tabla llamada Registro, el coordinador nota que un participante P no ha
aceptado su decisión, por lo que inserta un registro en la tabla de reconciliación.
Si el sitio S tiene una tupla (o, p) en su tabla Registro, S inicia la reconciliación enviando una solicitud de
reconciliación al sitio P junto con el vector de recepción. Si el nodo P acepta la reconciliación, P envía a S
su vector de recepción para el objeto “o” de la tupla.
8
Cada sitio utiliza el vector de recepción que ha recibido y busca en su propio archivo log aquellas
acciones que no se han ejecutado en el otro sitio, tales acciones son seleccionadas comparando la
estampa de tiempo de cada una de las opciones con la entrada de su sitio coordinador en el vector de
recepción.
Estas acciones son extraídas y enviadas al otro sitio. Cuando el sitio recibe estas acciones, las ejecuta y las
agrega a su archivo log. Al final de la reconciliación, se actualiza el vector de recepción de ambos sitios,
la actualización del vector es: a cada entrada se le asigna el valor máximo de las entradas
correspondientes de los dos vectores.
Después de ello, no hay necesidad de que haya comunicación entre los sitios. Efectivamente, el sitio S o P
podrían cancelar mientras los demás confirman.
4. CONCLUSIONES
- Como se notó para el algoritmo de Bloqueo de Dos Fases Distribuido, su característica primordial es
el bloqueo y la división de los bloqueos en dos fases primordiales como son las del crecimiento y
decrecimiento. Estas fases permitirán asegurar del todo que las operaciones no caigan en conflicto,
pero con la desventaja de que las copias de los datos en cualquiera de los nodos participantes estará
totalmente inservible hasta el momento de que la transacción correspondiente haga commit. Vale
decir que los bloqueos impedirán de cierta manera el acceso a los datos, con la finalidad de evitar la
inconsistencia.
- El algoritmo de Estampas de Tiempo Distribuido, logra evitar los bloqueos a los datos y cualquier
tipo de inconveniencia con un acceso libre a la información. Este algoritmo propone una
sincronización con tiempos que facilita enormemente el control de la concurrencia en todo el
sistema. Ya que las operaciones deben seguir un orden establecido por la marca de tiempo que los
acompaña. Si bien es cierto el algoritmo se ve aparentemente más eficiente, pero por otro lado usa
muchas estructuras para almacenar la información del estado de las transacciones y las operaciones.
REFERENCIAS BIBLIOGRÁFICAS
[1] H. D. RAMÓN, Conceptos de Bases de datos distribuidas[en línea], Argentina, 2006, disponible en:
<https://lidi.info.unlp.edu.ar/~fernando/clases.ppt>
[2] A. DÍAZ PEREZ, Sistema de bases de datos distribuidos[en línea], México, 2002, disponible en:
< http://www.cs.cinvestav.mx/SC/prof_personal/adiaz/Disdb/Cap_6.html>
[3] C. JIMENEZ QUINATANA, Bases de datos distribuidas[en línea], Universidad de Concepción, Chile,
2002, disponible en:
< http://www.inf.udec.cl/~basedato/>
[4] M. MERCEDES VITTURINI, Elementos de Bases de Datos, Informe inédito, Universidad Nacional del Sur –
Argentina , 48 pág, 2005
9
[5] B. BHARGAVA, Concurrency Control in Database Systems, Informe inédito, IEEE, 1999
[6] L. LAMPORT, Time Clocks and the Ordering of Events in a Distributed System, ACM, vol 21, 1989
Referencias
Veracidad Actualidad Claridad Profundidad Autenticidad Formato
Bibliográficas
10