Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Concurrencia PDF
Concurrencia PDF
Concurrencia
Pág. 2 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
1 Introducción al problema
1.1 Consistencia de la BD
Un esquema de BD incluye la descripción de los datos y las restricciones de integridad. Las restricciones de
integridad (RI) son consistentes en sí mismas si no incluyen contradicciones desde el punto de vista
semántico. Un estado de la BD es consistente si las RI son consistentes en sí mismas y dicho estado no
viola las RI (“satisface las RI”: E=RI(E))
LEER x1 ← X LEER x1 ← X
LEER x2 ← X IMPRIMIR x1
x2 ← 1 + x2 LEER x2 ← X
ESCRIBIR X ← x2 x2 ← 1 + x2
x1 ← 1 + x1 ESCRIBIR X ← x2
ESCRIBIR X ← x1 LEER x1 ← X
IMPRIMIR x1
A=B A=B
LEER a1 ← A LEER a1 ← A
a 1 ← 1 + a1 a 1 ← 1 + a1
ESCRIBIR A ← a1 ESCRIBIR A ← a1
LEER a2 ← A LEER a2 ← A
IMPRIMIR a2 a2 ← 2.a2
LEER b2 ← B ESCRIBIR A ← a2
IMPRIMIR b2 LEER b2 ← B
LEER b1 ← B b2 ← 2.b2
b1 ← 1 + b1 ESCRIBIR B ← b2
ESCRIBIR B ← b1 LEER b1 ← B
b1 ← 1 + b1
ESCRIBIR B ← b1
Transacción. Secuencia de acciones T{a1, a2 .. an} ejecutadas por un usuario de modo que se
respeta la consistencia de la BD; puede verse como una secuencia de
transformaciones tal que si S es un estado consistente (S ╞ I), entonces :
( ( ))
T ( S) =an an-1 ...a2 ( a1 ( S) ) ; T(S)╞ I,
Plan de ejecución Sea {T1, T2 .. Tn} un conjunto de transacciones; un plan de ejecución (schedule) será
de un conjunto de una secuencia de acciones de T1, T2 .. Tn respetando el orden de ejecución en cada
transacciones transacción.
(Schedule).
Plan serial. Un Plan S de {T1, T2 .. Tn} es serial si existe una permutación ∏ de {1, 2, …n} tal
que S = < T ∏1, T∏2 .. T∏n >
Plan serializable. Un Plan S de {T1, T2 .. Tn} es serializable si tras su ejecución se alcanza el mismo
estado final que con un plan serial de {T1, T2 .. Tn}
Justificación. Por definición de acción permutable, el resultado será el mismo tras cada permutación de
acciones; si al final se alcanza un plan serial que origina el mismo estado final (con una permutación serial)
se habrá conseguido demostrar que es serializable.
El plan S1 es serializable ya que las acciones ESCRIBIR A← a2 y ESCRIBIR B← b1 son permutables por
tratarse de distintos gránulos; reordenando relativamente a las transacciones los bloque de operaciones se
obtendría el plan S’1 que es un plan serial, luego S1 es serializable.
Pág. 4 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
A=B A=B
LEER a1 ← A LEER a1 ← A
a 1 ← 1 + a1 a 1 ← 1 + a1
ESCRIBIR A ← a1 ESCRIBIR A ← a1
LEER a2 ← A LEER b1 ← B
a2 ← 2.a2 b1 ← 1 + b1
ESCRIBIR A ← a2 ESCRIBIR B ← b1
LEER b1 ← B LEER a2 ← A
b1 ← 1 + b1 a2 ← 2. a2
ESCRIBIR B ← b1 ESCRIBIR A ← a2
LEER b2 ← B LEER b2 ← B
B2 ← 2.b2 b2 ← 2. b2
ESCRIBIR B ← b2 ESCRIBIR B ← b2
La condición suficiente anterior puede expresarse como “Es condición suficiente para que un plan S sea serializable
que su grafo de precedencia no incluya ciclos”.
Justificación. Sea un plan S con un grafo Gs sin ciclos; este grafo representa las relaciones de precedencia
que se deben a operaciones no permutables; es posible definir un orden parcial de transacciones asociado a
Gs <Ti1, T i2, .. Tin> y reordenar el resto de operaciones permutables con arreglo a él; este orden parcial
puede dar lugar a un orden total de transacciones originando una permutación serial de transacciones, con
lo cual S sería serializable.
Pág. 5 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
C = 1 0
0 0
Tablas de bloqueos.
a1 Para cada gránulo g se considera el vector de bits A(g) donde aj = 1 si g está
. bloqueado en modo mj por alguna transacción.
A(g) = a j
.
a k
m1 Por otro lado asociado a un gránulo, puede considerarse el vector Mp donde
. consten todas las peticiones de bloqueos BLOQUEO(Tp, Mp, g) solicitadas por la
transacción Tp; en él mj=1 si se ha solicitado el modo Mj sobre el gránulo g.
M p = mj
.
m k
3.2 Definiciones
Pueden considerarse los operadores Booleanos: ⌐ negación de un vector Booleano, ⋀ intersección de dos
vectores, ⋁ unión de dos vectores, ⊃ ⊇ inclusión de vectores, y el producto de matrices lógicas ( • )
donde la multiplicación se sustituye por la intersección lógica y la suma por la unión lógica.
1
Modo de operación: Propiedad que caracteriza a una operación de manipulación de datos, determinando su compatibilidad con
otras operaciones. p. ej. Son modos lectura, inserción, actualización, eliminación, lectura protegida, etc.
Pág. 6 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
Es posible afirmar que los modos de operación solicitados durante una operación primitiva
BLOQUEO(Tp,Mp,g) ejecutadas por una transacción Tp son compatibles con los modos de bloqueo activos
sobre un gránulo g debidos a otras transacciones si se cumple ¬ ( ¬C • A( g ) ) ⊇ Mp
Justificación:
A( g ) Es un vector de bits cuyo bit i = 1 si g está bloqueado en modo mj por alguna
transacción.
Cuando los modos solicitados no son compatibles se generará una cola de espera Q(g) sobre el gránulo g
(gránulo ocupado) de transacciones en espera hasta que dicho gránulo quede disponible; esta cola estará
ordenada normalmente por esquemas de prioridades de transacciones o en su defecto por orden de llegada.
A la cola se le asociará el vector M y el identificador de cada transacción <i, M>.
Bloqueo(Tj1,Mj1,g)
Bloqueo(Tjs,Mjs,g) Bloqueo(Tp,Mp,g)
g
Desbloqueo(T’p,M’p,g,)
Bloqueo(Tq1,Mq1, g)
∨j Bloqueo(Tj,Mj, g) ,
.
. Bloqueo (Tqr, Mqr, g)
Pág. 7 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
DESBLOQUEO (Tp , Mp , g )
A ( g ) =∨ M j
j≠ p
Para c ada (T q , M q ) ∈ Q ( g )
Si M q ⊆ ¬ ( ¬ C • A ( g ) ) 'El vector de bloqueo T q es ahora compatible
A( g ) =A( g ) ∨ M q 'Se añade M q al estado de bloqueo del gránulo ; T q gana bloqueo
Q ( g ) = Q ( g ) − M q; 'T q sale del estado de espera
FIN DESBLOQU EO ()
Fig. 9. – Algoritmo de bloqueo en dos fases. Procedimiento DESBLOQUEO
Generalmente, al final de una transacción se provocará el desbloqueo de todos los gránulos accedidos. La
implementación de éstas dos acciones puede ser automática (responsabilidad del SGBD) o bien explícita en
las transacciones, incluyéndose como sentencias en las interfases con el DBMS de los lenguajes de
programación.
Pág. 8 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
Transacción bien Transacción que bloquea en los modos correctos de operación todos los
formada gránulos accedidos antes de una operación sobre ellos y los desbloquea
después de dicha operación.
Transacción en dos Transacción bien formada que no ejecuta un BLOQUEO después de haber
fases ejecutado un DESBLOQUEO.
Pueden formularse las siguientes reglas asociadas al protocolo de bloqueo en dos fases:
R1 Cada transacción debe ejecutar un BLOQUEO con los modos de operación correctos sobre los
gránulos a acceder antes de ejecutar una operación sobre dichos gránulos.
R2 Cada transacción debe ejecutar un DESBLOQUEO sobre los gránulos bloqueados después de
operar sobre ellos.
Nº de
gránulos
bloqueados
El número de gránulos bloqueados crece en la
primera fase hasta un máximo y en la segunda fase
decrece hasta la liberación si la transacción termina
con éxito.
1ª FASE 2ª FASE t
Comienzo Tp Fin Tp
En estas condiciones Cada plan de una transacción bien formada en dos-fases es serializable.
Justificación . Sea {T1, T2, ..Tn} un conjunto de transacciones en dos fases; asumiendo la existencia de un
circuito en su grafo de precedencia Ti1 < Ti2 < …< Tin < Ti1 puede afirmarse que :
ya que cada transacción es en dos-fases desbloquearán sólo después de que han completado todos sus
BLOQUEOS, luego Ti1 desbloquea gi1 antes de ejecutar el BLOQUEO sobre gin luego Ti1 no es en dos-
fases, lo que contradice la hipótesis inicial.
Pág. 9 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
T1 T2
Bloqueo(g1,upd) g2,upd g2,upd
Bloqueo (g2,upd) T1 T2
Bloqueo (g2,upd)
g1,upd g1, prot_leer
Bloqueo (g1,prot_leer)
Grafo de espera. Grafo G(T, W) donde T es un conjunto de transacciones activas {T1, T2, ..Tn}
compartiendo gránulos {G1, G2, ..Gm} y W es la relación de “espera“ definida como sigue: Tp espera a Tq
si Tp demanda el bloqueo de un gránulo Gi y dicha operación no puede realizarse porque Gi está
bloqueada por Tq.
• DIE-WAIT. Solo la transacción más vieja puede esperar por una transacción más joven (con mayor
timestamp de inicio); es decir Ti espera por Tj si i < j y se aborta en otros casos (muere la
transacción más joven). Cuando una transacción muere, se reinicia con el mismo timestamp; así
tarde o temprano pasará a ser la transacción activa más vieja y por tanto no morirá. Esto garantiza la
ausencia de circuitos en un grafo de espera y en el entorno de BD de rollback permanente.
• WOUND-WAIT. Es el inverso del método anterior; en este caso, sólo una transacción más joven
puede esperar por una transacción más vieja: Ti espera por Tj si i > j. Para evitar el rollback
permanente, la transacción que solicita el BLOQUEO de un gránulo bloqueado por una transacción
más joven, la transacción más vieja remplaza a la más joven que se aborta; así si Ti solicita
BLOQUEO de un gránulo g bloqueado por Tj; Tj se mata si i<j y conseguirá Ti el BLOQUEO.
T3 N(5)=0
g5
T5
N(3)=1 g4
N(1)=1 N(2)=1
T1 T2
g1 g2
T3
g5
N(3)=1
Pág. 11 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
Cuando se detecta un abrazo mortal el problema consistirá en seleccionar una transacción a reiniciar. El
algoritmo presenta la lista de transacciones en la situación. Una posible solución es reiniciar la
transacción involucrada en la situación que bloquea el mayor número de otras transacciones;
corresponderá a vértices que tienen un gran número de arcos entrantes en le grafo de espera.
Para reducir el coste de la detección, este algoritmo puede ser invocado sólo cuando una transacción ha
estado en espera durante un tiempo límite (unos pocos segundos); con esto último, el enfoque de
detección puede ser una solución aceptable al abrazo mortal; extensible incluso a sistemas distribuidos.
DETECCIÓN()
T:= {Tj tales que N(j) ≠ 0}
L:= {gránulos bloqueados por Ts € T}
Para cada G € L
Para cada “petición R no-marcada de Tk esperando Gi ”
Si BLOQUEO-TENTATIVO(Gi,R,K) = true
“marcar R”
N(K) = N(K) – 1
Si N(K) = 0
“Eliminar Tk de T”
“Añadir los gránulos bloqueados de Tk a L” ;
Si T= ∅
DETECCIÓN := false
sino
DETECCIÓN := true ;
FIN DETECCIÓN();
Fig. 13. – Algoritmo de detección de abrazo mortal.
Pág. 12 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
Timestamp de Valor numérico asociado a una transacción que permite que sean ordenadas
transacción respecto a otras transacciones.
Es normal utilizar contadores generados por un sistema central o bien el
propio reloj del sistema.
Pág. 13 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
Puede darse una situación conflictiva conocida como efecto dominó, que sucede cuando las
actualizaciones de Tj fueron leídas por otras transacciones; estas transacciones deben ser reiniciadas, es
decir, abortar Tj puede generar una situación donde una actualización realizada por Tj es deshecha mientras
que su efecto fue visible por una transacción Tk, lo cual puede requerir que también se aborte Tk, pudiendo
generarse esta situación en cadena. Esta situación se resuelve provocando una ordenación de los COMMIT
s de las transacciones de acuerdo con el timestamp de las mismas.
Cuando una transacción ejecuta un LEER, el gestor de tareas controla la secuencia correcta de la lectura
respecto de la última escritura (el timestamp de lectura de la transacción debe ser mayor que el valor del
timestamp de escritura del gránulo), p.ej. si un gránulo ha sido actualizado por T2, se tendrá SW=2 ; si ha
sido leído por la transacción más joven T7 será SR=7; en esta situación cualquier transacción con timestamp
igual o mayor que 2 podrá leer sin problemas.
Pág. 14 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
La estrategia anterior puede ser mejorada preservando varias versiones del mismo gránulo. Para cada
gránulo g, el sistema debería preservar un conjunto de timestamp de escritura del gránulo {SWi(g)} con los
valores asociados del gránulo en dichas versiones {Vi(g)}, y del mismo modo un conjunto de timestamp de
lectura del gránulo {SRi(g)}. Así un gránulo versión i está definido por la tupla < SWi(g), SRi(g), Vi(g) >. Se
creará una versión i para cada actualización del gránulo g efectuada por una transacción Ti. Se propone el
siguiente algoritmo para otorgar y crear versiones del mismo gránulo en memoria (buffer pool).
Por ejemplo para un gránulo g que ha sido sucesivamente actualizado por T1, T5 y T10 y recuperado por
transacciones T7 y T11 tendría la siguiente tabla de versiones:
De este modo es posible establecer el orden adecuado de operaciones de lectura respecto a operaciones de
escritura sin tener que abortar ni reiniciar transacciones; para ello es suficiente con suministrar a una
transacción Ti que solicita una lectura del gránulo g con la versión cuyo timestamp de escritura del gránulo
es inmediatamente inferior o igual a i.
Pág. 15 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
Si una transacción Ti requiere una lectura del gránulo, se le suministrará la versión inmediatamente inferior.
Para tratar las escrituras de una Ti se insertarán nuevas versiones creadas por las transacciones justo después
de encontrar un timestamp de escritura del gránulo inmediatamente más bajo, Vi’. Si, de cualquier modo,
antes de las acciones de escritura de Ti, una transacción Tk con timestamp k>i ha leido Vi’, entonces alguna
de las dos debe ser abortada (Ti o Tk ); es imposible escribir en el pasado (en el sentido de rehacer desde ese
momento) sin rehacer sus consecuencias (“este pasado fue visto por otras transacciones”). De cualquier
modo Tk puede ser abortada solo si no había terminado; normalmente es preferible reiniciar Ti con un
nuevo timestamp i’ (i’>i) y así evitar rehacer el pasado que se confirmó.
Caso 3. T6 solicita una escritura sobre el gránulo g; en este caso corresponderá darle la versión
inmediatamente anterior, versión 5 con timestamps SW=5, SR=7, cumpliéndose que el timestamp de
lectura del gránulo es mayor (T7 vió esta versión) que el timestamp de la transacción (T6). Hay que abortar
alguna transacción en vuelo (T6 o T7 según el algoritmo, pudiendo elegir entre las dos sólo si T7 no ha
alcanzado el commit).
Caso 3b. Se aborta T6 y se reinicia con timestamp superior a la última versión existente.
Gránulo g Transacción Acción SW SR Versión
T6 ABORT
T12 ≅antiguaT6 Restart
T12 Escribir 12 12 12
Fig. 20.- Situación de versiones al abortar la transacción que solicita la escritura.
Pág. 16 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
5 Algoritmos optimistas.
Los algoritmos de ordenación por timestamp verifican el correcto ordenamiento de las transacciones sobre
cada acceso a los gránulos al igual que los algoritmos de bloqueo; estos dos tipos de algoritmos
implementan un control a priori. Si el gestor de tareas se diseña de modo que deje mayor libertad a las
transacciones y realiza un control de las mismas, en vez de durante su ejecución en tiempo de confirmación
de cambios a la BD se está barajando la idea básica de los métodos optimistas de control de concurrencia. Los
algoritmos optimistas consideran que todas las transacciones preparan sus actualizaciones en buffers
privados durante la ejecución; al finalizar, antes de la confirmación todas las actualizaciones deben sufrir un
proceso de certificación (o validación).
Certificación. Acción especial que controla que la confirmación de actualizaciones de una transacción en la
BD preserva la serializabilidad.
Si la transacción es certificada las actualizaciones preparadas se harán visibles a otras transacciones, y si falla
la transacción se abortará. En definitiva, con un control optimista de la concurrencia, una transacción
sufrirá tres fases: fase de lectura, donde se preparan actualizaciones en áreas de trabajo privadas de las
transacciones, fase de certificación y la posible fase de escritura.
El problema principal de estos métodos es la elección del algoritmo de certificación donde el orden de
serialización estará determinado por el orden de certificación. En esta fase se deberá comprobar que una
transacción validada Ti ha visto todas las modificaciones de las precedentes transacciones que también lo
han sido; dicho de otro modo, todos los gránulos leídos por Ti no deben haber sido escritos por cualquier
otra transacción Tj certificada entre el comienzo de Ti y la certificación de Tj. El algoritmo mantendrá los
conjuntos de timestamp de lectura y escritura de cada transacción sobre los gránulos SR(Ti) y SW(Ti); se
aceptará una validación de Ti si SR(Ti) ∩ SW(Tj) = ∅,∀Tj certificada durante la fase de lectura de Ti .
En la siguiente figura se propone un algoritmo de certificación; éste puede rechazar una transacción que no
viola el orden de serializabilidad.
Pág. 17 de 18
Diseño de Bases de Datos Concurrencia
Sevilla, octubre 2004, V 2004.02.1
Así, el algoritmo de certificación puede ser mejorado rechazando menos transacciones utilizando timestamp
de gránulos. Los algoritmos de certificación sufren el inconveniente de tener que deshacer al finalizar las
transacciones, lo cual se puede agravar cuando, permanentemente, transacciones largas sufren a
consecuencia de transacciones cortas. Puede afirmarse que los algoritmos optimistas son aceptables sólo en
el contexto de transacciones muy cortas con baja probabilidad de conflicto. También se pueden considerar
eficientes en conjunción con algoritmos de recuperación del tipo NO-UNDO.
Pág. 18 de 18