Control de Concurrencia Control de Concurrencia Operaciones

Anuncio
BASES DE DATOS I
Control de Concurrencia
Objetivo
•Forzar
el aislamiento de transacciones
conflictivas mediante la exclusión mutua.
•Preservar
la consistencia de la BD mediante
la ejecución adecuada de las transacciones.
•Resolver
los conflictos de escritura simultánea
y de lecto-escritura simultáneas.
BASES DE DATOS I
Control de Concurrencia
AIslamiento (+ Consistencia) Control de
Concurrencia
Base de Datos compuesta por ítems de
datos
Transacción read/write de ítems de
datos de la BD
BASES DE DATOS I
Operaciones Conflictivas
Plan de ejecución (schedule): desarrollo en el
tiempo de la ejecución de transacciones
concurrentes ejecución intercalada de
sentencias de las transacciones.
Un schedule mantiene el orden de las
operaciones dentro de cada transacción.
Dos operaciones de un plan de ejecución son
conflictivas si satisfacen las siguientes
condiciones:
(1)
(2)
(3)
Pertenecen a diferentes transacciones
Intentan acceder al mismo ítem
Una o las dos operaciones intentan escribir sobre
el ítem
1
BASES DE DATOS I
Operaciones Conflictivas
Dos transacciones que acceden al mismo ítem
intercaladas de manera que producen un resultado
incorrecto.
T1
read_item(X);
X  X - N;
write_item(X);
read_item(Y);
T2
X
Y
read_item(X);
X  X + M;
40
43
38
85
write_item(X);
43
Y  Y + N;
write_item(Y);
X=40
Y=85
N=2
M=3
40
38
87
87
X fue sobreescrito !! Los valores correctos debieron
ser:T1, T2 X=41, Y=87 o bien T2, T1 X=41 , Y=87
BASES DE DATOS I
Problemas típicos de la concurrencia
Actualización perdida (Lost Update
Problem)
Análisis (sumario) Inconsistente o Lectura
no Repetible (Unrepeatable Read
Problem)
Lectura Sucia o Fantasma (Dirty Read
Problem)
BASES DE DATOS I
Actualización Perdida
T1
T2
read_item(X);
read_item(Y);
read_item(X);
read_item(Y);
X  X – 2*Y
X  Y;
write_item(X);
commit
write_item(X);
commit
X = 40
40
Y=5
5
40
5
30
5
30
5
Trans-1, Trans-2 X=5
Trans-2, Trans-1 X= -5
No necesariamente las diferentes ejecuciones seriales arrojan el mismo
resultado !!
2
BASES DE DATOS I
Análisis Inconsistente
T1:
T2:
T1
T2
Suma  0;
0
read_item(A);
4
Suma  suma + A;
A=4
X=4
Y=8
N=2
suma
4
read_item(X);
4
X  X - N;
2
write_item(X);
2
read_item(X);
2
suma  sum + X;
6
read_item(Y);
8
suma  suma + Y;
14
read_item(Y);
8
Y  Y + N;
10
write_item(Y);
10
El análisis inconsistente ocurre por utilizar registros en distinto estado de
actualización!!T2 utiliza X actualizado e Y sin actualizar
BASES DE DATOS I
Lectura Sucia o Fantasma
T1:
T2:
T1
read_item(X);
4
X  X - N;
2
write_item(X);
T2
2
read_item(X);
2
X  X- N;
0
write_item(X);
0
N=2
Falla!!
Al fallar T1, el valor X=2 virtualmente nunca existió !! T2 leyó un
valor “fantasma”
BASES DE DATOS I
Plan de Ejecución de Transacciones
Serializabilidad de Transacciones el
resultado de la ejecución concurrente de dos
o más transacciones debe ser igual al que se
hubiese obtenido de una ejecución serial (no
concurrente)
Si hay N transacciones ejecutándose
concurrentemente N! ejecuciones seriales
posibles
3
BASES DE DATOS I
Serializabilidad
Idea: cuáles operaciones pueden intercambiarse
en un plan de ejecución?
Las siguientes NO, pues el resultado cambia !!:
Acciones de la misma transacción
Acciones en diferentes transacciones sobre
el mismo ítem, cuando al menos una de las
acciones es write
BASES DE DATOS I
Serializabilidad de los Planes de Ejecución
Serial
Un plan es serial si para cada transacción
participante, todas las operaciones se
realizan consecutivamente en el plan (no
hay intercalado de sentencias).
Serializable
Un plan es serializable si es equivalente
a cualquier plan serial de las mismas
transacciones.
BASES DE DATOS I
Conflictos
Planes conflicto-equivalentes:
Tienen el mismo conjunto de
acciones, y
Cada par de acciones conflictivas
están ordenadas de la misma forma
Un plan es conflicto-serializable si es
conflicto-equivalente a un plan serial
4
BASES DE DATOS I
Bloqueos (locks)
Cerrojo que crea una zona de exclusión en determinados ítems de
datos.
El tamaño del bloqueo define la granularidad: fina (nivel de datos)
gruesa (BD)
Cerrojo: variable asociada a cada ítem de dato
Describe el estado de un ítem con respecto a las operaciones
que pueden realizarse sobre él
Cerrojo binario: Locked/Unlocked
Cerrojo multimodo: ReadLock / WriteLock / Unlocked
Tres operaciones
read_lock(X)
write_lock(X)
unlock(X)
Cada ítem de dato puede estar en cualquiera de los tres estados.
BASES DE DATOS I
Bloqueos (locks)
Granularidad
Afecta significativamente el nivel de concurrencia
Afecta significativamente el desempeño del control de
concurrencia
Ejemplos de granularidad de ítems:
Un campo de un registro de una BD.
Un registro de la BD.
Un bloque de disco.
Un archivo completo.
Toda la BD.
Los locks se almacenan en una tabla del sistema.
Pueden ‘promover’ (upgrade lock): ReadLock WriteLock
Pueden ser ‘degradados’ (downgrade lock): WriteLock ReadLock
BASES DE DATOS I
Granularidad
5
BASES DE DATOS I
Bloqueos (locks)
Los bloqueos sobre ítems de datos pueden
combinarse limitadamente
S-locks (compartidos/shared) para lecturas:
slock(x) (≡ReadLock(x))
bloqueo solicitado
Bloqueo en el ítem
-
S
X
-
Ok
Ok
Ok
S
Ok
Ok
---
X
Ok
---
---
Compatibilidad de bloqueos
X-locks (exclusivos) para escrituras: xlock(x)
(≡WriteLock(x))
BASES DE DATOS I
Control de Concurrencia: Estrategias
Los DBMSs no verifican la serializabilidad
Muy ineficiente o impracticable !! (estrategia
reparadora)
Las transacciones arriban continuamente
Se requieren innumerables ‘undo’
Debería ‘ir probando’ todas las combinaciones
Solución: protocolos (estrategia preventiva)
Se puede garantizar la serializabilidad de los planes
de ejecución si cada transacción sigue el protocolo y
éste es forzado por el procesador de transacciones.
BASES DE DATOS I
Grafos de Precedencia
T1:
read_item(X);
X:= X - N;
write_item(X);
read_item(Y);
Y:=Y + N;
write_item(Y);
T2:
read_item(X);
X:= X + M;
write_item(X);
T1:
read_item(X);
X:= X - N;
write_item(X);
read_item(Y);
Y:=Y + N;
write_item(Y);
T2:
T1:
T2:
read_item(X);
X:= X + M;
write_item(X);
read_item(X);
X:= X - N;
write_item(X);
read_item(Y);
Y:=Y + N;
write_item(Y);
T1:
read_item(X);
X
 X - N;
write_item(X);
read_item(Y);
Y  Y- P
read_item(X);
X  X + M;
write_item(X);
write_item(Y);
read_item(X);
X:= X + M;
write_item(X);
T2:
read_item(Y);
Y  Y + N;
write_item(Y);
6
BASES DE DATOS I
Grafo de Serializabilidad
Un nodo para cada transacción Ti
Un arco de Ti a Tj si hay una operación de Ti
que precede y entra en conflicto con una de Tj
Teorema: Un plan de ejecución es serializable
por conflictos si y sólo si su grafo de
serializabilidad es acíclico.
BASES DE DATOS I
Locks no evitan todos los problemas …
Ejecutadas según un plan concurrente, con cerrojos
T1
T2
read_lock(Y);
read_item(Y);
unlock(Y);
Desbloquea demasiado pronto !!
write_lock(X);
read_item(X);
X X+Y;
write_item(X);
unlock(X);
read_lock(X);
read_item(X);
unlock(X);
write_lock(Y);
read_item(Y);
Y X+Y;
write_item(Y);
unlock(Y);
T1
X
Y
T2
Resultado: X=50, Y=50
No-serializable!
ciclo en el grafo
BASES DE DATOS I
Protocolo de Bloqueo en 2 Fases (P2F)
Se dice que una transacción sigue el
protocolo de dos fases si TODOS los
bloqueos (fase de crecimiento) preceden al
primer desbloqueo (fase de decrecimiento)
7
BASES DE DATOS I
Protocolo de Bloqueo en 2 Fases (P2F)
Básico: cuando una transacción devuelve un
ítem, ya no puede bloquear ningún otro
Punto de bloqueo
Cantidad
de
bloqueos
BEGIN
bloquea
desbloquea
Fase 1
crecimiento
Fase 2
decrecimiento
END
duración de la
transacción
BASES DE DATOS I
Ejemplo: Dos transacciones
T1
read_lock(Y);
read_item(Y);
unlock(Y);
write_lock(X);
read_item(X);
X  X+Y;
write_item(X);
unlock(X);
T2
read_lock(X);
read_item(X);
unlock(X);
write_lock(Y);
read_item(Y);
Y X+Y;
write_item(Y);
unlock(Y);
Ejecutadas según un plan serial S1: T1, T2
Valores iniciales X=20, Y=30 → Resultado: X=50, Y=80
BASES DE DATOS I
Ejemplo: Dos transacciones según el P2F
T1’
T2’
read_lock(Y);
read_item(Y);
write_lock(X);
unlock(Y);
read_item(X);
X  X+Y;
write_item(X);
unlock(X);
read_lock(X);
read_item(X);
write_lock(Y);
unlock(X);
read_item(Y);
Y  X+Y;
write_item(Y);
unlock(Y);
T1’ y T2’ siguen el P2F
Cualquier plan de ejecución de T1’ y T2’ será serializable
La concurrencia es limitada por la necesidad de arbitrar
requerimientos de ambas transacciones
8
BASES DE DATOS I
Variaciones del P2F
P2F Conservativo : Bloquea TODOS los ítems que necesita
ANTES de comenzar la ejecución, predeclarando su conjunto de
ítems de lectura y escritura
Si uno o más ítems están siendo bloqueados por otra
transacción, la transacción que lo requiere ESPERA
No se produce Deadlock, pero es muy restrictivo
P2F Estricto: Una transacción no desbloquea sus ítems de
escritura (WriteLocks) hasta que alcanza el commit o bien aborta
No está libre de deadlocks pero garantiza la recuperabilidad del
plan (Plan estricto: una transacción no puede leer/escribir X
hasta que la última transacción que haya usado X haya llegado
al commit o abortado)
Es la versión más popular
BASES DE DATOS I
Protocolo de Bloqueo en 2 Fases (P2F)
Estricto
bloquea
desbloqueo
Cantidad
de
bloqueos
BEGIN
Período de uso
del ítem
duración de la
END transacción
BASES DE DATOS I
Protocolo de Bloqueo en 2 Fases (P2F)
Componentes Esenciales
Lock Manager: Administra los bloqueos sobre los
ítems de datos.
Lock table: La utiliza el Lock Manager para
almacenar los siguientes datos:
o
La Base de Datos requiere que todas las
transacciones estén bien formadas • Debe bloquear los ítems de datos, antes de leerlos o
escribirlos.
• No bloquea un ítem sobre el que ya tiene un bloqueo ni
intenta desbloquear un ítem libre.
9
BASES DE DATOS I
Operaciones de Bloqueo
Componentes básicos del bloqueo binario: LOCK obtenido ← no
Repetir
If LOCK (X) = 0 (*el ítem está desbloqueado*)
Then LOCK (X) ← 1 (*bloquearlo*)
obtenido ← si
Else Begin
esperar … (hasta que LOCK (X) = 0
y el Lock Manager active la transacción)
Hasta obtenido = si
End;
BASES DE DATOS I
Operaciones de Bloqueo
Componentes básicos del bloqueo binario: UNLOCK LOCK (X) ← 0 (*desbloquea el ítem*)
If existe alguna transacción esperando por X
Then activar una y adjudicarle el ítem;
BASES DE DATOS I
Operaciones de Bloqueo
Componentes básicos del bloqueo multimodo: READLOCK
obtenido ← no
Repetir
If LOCK (X) = “unlocked”
Then Begin LOCK (X) ← “read-locked”
#reads (X) ← 1
obtenido ← si;
End
Else If LOCK (X) ← “read-locked”
Then #reads (X) ← #reads (X) +1
obtenido ← si
Else Begin esperar… (hasta que LOCK
“unlocked” y el Lock Manager active la transacción)
End
Hasta obtenido = si
End;
(X)
=
10
BASES DE DATOS I
Operaciones de Bloqueo
Componentes básicos del bloqueo multimodo: WRITELOCK obtenido ← no
Repetir
If LOCK (X) = “unlocked”
Then Begin LOCK (X) ← “Write-locked”;
#writes (X) ← 1;
obtenido ← si;
End
Else Begin esperar (hasta que LOCK (X) = “unlocked
y el Lock Manager active la transacción)
Hasta obtenido = si
End;
BASES DE DATOS I
Operaciones de Bloqueo
Componentes básicos del bloqueo multimodo: UNLOCK If LOCK (X) = “write-locked”
Then Begin LOCK (X) ← “unlocked”;
activar una de las transacciones que esperan si hay alguna
End
Else If LOCK (X) ← “read-locked”
Then Begin #reads (X) ← #reads (X) -1
If #reads (X) = 0
Then Begin LOCK (X) = “unlocked”;
Activar alguna transacción en espera si la hay
End
End;
BASES DE DATOS I
Abrazo Mortal (deadlock)
Dos o más transacciones esperan
indefinidamente que otra devuelva un
ítem de dato.
T1
read_lock(Y);
read_item(Y);
write_lock(X);
no puede espera !!
T2
read_lock(X);
read_item(X);
write_lock(Y);
no puede espera !!
11
BASES DE DATOS I
Abrazo Mortal (deadlock) e Inanición (livelock)
Para prevenir deadlocks P2F conservativo
Timestamping las transacciones más
jóvenes son abortadas
Detección de deadlocks T1
T2
Grafo espera-por
Selección de una ‘víctima’
Recomienzo cíclico
Livelock: una transacción no puede obtener los
recursos que necesita por un período de tiempo
indefinido, mientras las otras avanzan
normalmente Estrategia first-come-first-served
BASES DE DATOS I
Equivalencia y Serializabilidad por Vistas
Equivalencia:
Para cada ítem X, si Ti lee el valor inicial de X en
P1, Ti debe leer también el valor inicial de X en
P2.
Para cada lectura de X por Ti en P1, si el valor
leído por Ti es escrito por Tj, Ti debe también
leer el valor de X producido por Tj en P2.
Para cada ítem X, si la última escritura de X fue
ejecutada por Ti en P1, la misma transacción
debe escribir el valor final de X en P2.
BASES DE DATOS I
Equivalencia y Serializabilidad por Vistas
Un plan S es serializable por vistas (view
serializable) si es equivalente por vistas a un
esquema serial.
Ofrece una definición menos restrictiva de plan de
ejecución que la serializabilidad por conficto: Cada
plan conflicto-serializable es serializable por vistas.
12
BASES DE DATOS I
Serializabilidad Semántica
Algunas aplicaciones pueden producir planes
correctos aunque no sean serializables ni por
conflicto ni por vistas.
Ejemplo: Débito/Crédito (Suma y resta se vuelven
conmutativas)
T1
T2
T1
read_item(X);
X:=X-10;
write_item(X);
read_item(Y);
Y:=Y+10;
write_item(Y);
T2
read_item(Y);
Y:=Y-20;
write_item(Y);
read_item(Z);
Z:+Z+20;
write_item(Z);
read_item(X);
X:=X-10;
write_item(X);
read_item(Y);
Y:=Y+10;
write_item(Y);
read_item(Y);
Y:=Y-20;
write_item(Y);
read_item(Z);
Z:+Z+20;
write_item(Z);
BASES DE DATOS I
Métodos para Serializabilidad
Multi-version: se aguardan los valores viejos de los
ítems de datos cuando estos son actualizados.
Timestamps: son identificadores únicos de las
transacciones, generados por el sistema. Las
transacciones se ordenan por este identificador para
lograr la serializabilidad.
Protocolos: cuando cada transacción adhiere a un
protocolo, se garantiza la serializabilidad de todos
los planes en los cuales participen esas
transacciones bloqueos.
Control de Concurrencia Pesimista
Verifica antes de modificar la BD, bloqueando
datos antes de leerlos o escribirlos, o chequeando
timestamps.
BASES DE DATOS I
Transacciones en SQL 92
Start Transaction
No hay una sentencia explícita
Implícitamente comienza por una sentencia
SQL
End Transaction
Si ocurre COMMIT o ROLLBACK
Automáticamente con AUTOCOMMIT cuando
se completa la sentencia SQL
13
BASES DE DATOS I
Estableciendo Propiedades
SET TRANSACTION
[READ ONLY | READ WRITE]
ISOLATION LEVEL
[READ UNCOMMITTED | SERIALIZABLE |
REPEATABLE READ | READ COMMITTED]
BASES DE DATOS I
Niveles de Aislamiento
Read Uncommitted
Read Committed
Puede ver cambios comprometidos de otras
transacciones
No hay lectura sucia, pero es posible la lectura norepetible
Aceptable para consultas o soporte a las decisiones
Repeatable Read
Puede ver cambios no comprometidos de otras
transacciones
Lectura sucia, Lectura no-repetible
Recomendada solamente para funciones estadísticas
No hay lectura sucia ni no-repetible
Puede exhibir el fenómeno ‘fantasma’
Serializable
BASES DE DATOS I
Niveles de aislamiento
14
BASES DE DATOS I
Implementación de Niveles de Aislamiento
Read Uncommitted
Read Committed
sin S-locks
S-locks pueden ser levantados en cualquier
momento
X-locks con el P2F estricto
Repeatable Read
Serializable
P2F estricto sobre todos los datos
P2F estricto sobre todos los datos e índices
BASES DE DATOS I
Tuplas Fantasma
Si una transacción bloquea tuplas de una relacion, por
ej. Con el atributo X=25, y luego se insertan nuevas
tuplas en la relación con X=25 para algunas
transacciones este puede ser un comportamiento no
serializable.
o
o Estas tuplas se llaman fantasmas
o Los fantasmas pueden ser evitados estableciendo un
lock exclusivo en TODA la relación, antes de insertar
tuplas limita el grado de concurrencia.
o El programador puede elegir el nivel de aislamiento en
SQL, para permitir o evitar este fenómeno.
BASES DE DATOS I
Locks en Índices
Cuando se actualiza una relación (archivo) actualización de los índices asociados
o
o Nuevamente locks para asegurar
serializabilidad.
o Árboles-B la raíz puede ser alterada por
cualquier actualización actualizaciones
concurrentes no pueden ser manejadas con locks!!
15
BASES DE DATOS I
Locks en Árboles-B
Idea Establecer un bloqueo exclusivo en un
nodo si existe la posibilidad de que sea
actualizado.
Bloquear todo el camino hacia la base.
Desbloquear el camino desde la base al
nodo, tan pronto como se haya
actualizado.
Protocolo de árbol
BASES DE DATOS I
Problemas con los Bloqueos
Los bloqueos evitan la no-serializabilidad.
Resultan demasiado estrictos en algunos casos,
limitando innecesariamente el grado de
concurrencia enfoque pesimista.
Otras estategias se desempeñan mejor si las
transacciones no entran en conflicto con
frecuencia enfoque optimista.
BASES DE DATOS I
Optimismo vs pesimismo
Enfoque Pesimista mejor en situaciones de alto
conflicto:
Menor cantidad de abortos.
Menor tiempo de procesamiento.
Enfoque Optimista mejor en situaciones de
bajo conflicto (por ej. muchas transacciones de
solo lectura).
Mayor grado de concurrencia.
En la práctica soluciones híbridas.
16
BASES DE DATOS I
Timestamps (Marcas de Tiempo)
Asocia un número único a cada transacción timestamp (marca o estampado de tiempo ≡
’fecha de nacimiento’ de la transacción).
Las transacciones son ejecutadas en forma
intercalada pero simulando su ejecución según su
’fecha de nacimiento’ (las mas jóvenes primero).
No hay bloqueos no puede producirse deadlock.
Cada dato que es accedido adquiere una marca, si
la operación es posible.
BASES DE DATOS I
Plan de Ejecución basado en Marcas de
Tiempo
Si una transacción T:
Intenta leer un ítem de la BD escrito por una
transacción no comprometida esperar hasta que
alcance el commit o aborte.
Intenta leer un ítem que ha sido actualizado por una
transacción más joven (> timestamp!!) rollback.
Intenta actualizar un ítem que ha sido actualizado o
leído por una transacción más joven rollback.
Rollback recomienzo de T con un nuevo timestamp
Actualización física no puede ejecutarse (por conflicto)
no se ejecuta ninguna de las operaciones de la
transacción (atomicidad) reinicio no requiere
rollback pues no hay datos físicamente actualizados.
BASES DE DATOS I
Plan de Ejecución basado en Marcas de
Tiempo
El sistema debe conocer, para cada ítem de
dato, la marca de tiempo de la transacción más
joven que leyó o actualizó el ítem valores de
sincronización.
r(X) - timestamp de la transacción más joven
que ejecutó read(X)
w(X) - timestamp de la transacción más joven
que ejecutó write(X)
17
BASES DE DATOS I
Marcas de Tiempo: Mecanismo
Para cada transacción T, con timestamp t(T):
T intenta ejecutar READ(Xi) if t(T) >= w(Xi)
then r(Xi)  max(t(T), r(Xi))
else reiniciar T
T intenta ejecutar WRITE(Xj) if t(T) >= r(Xj) & t(T) >= w(Xj)
then w(Xj)  t(T)
else reiniciar T
BASES DE DATOS I
Marcas de Tiempo: Act. Perdida Revisitado
Transacción A
Leer X
Actualizar X
tiempo
Transacción B
t1
t2
Leer X
t3
t4
Actualizar X
Si A es más joven que B, t(A) > t(B) La actualización de B en t4 fallará porque en t3 w(X)  t(A) y
t(A) > t(B) B se reinicia.
Si A es más antigua que B t(A) < t(B)
A debería reiniciarse en t3 porque en t2 r(X)  t(B) y t(B) > t(A)
Livelock
y deadlock no ocurren con marcas de tiempo pero el
reinicio reiterado es un problema.
BASES DE DATOS I
Bibliografía
Date, C.: “An Introduction to Database Systems”. 7º edición. Addison
Wesley. 2000.
Elmasri, R., Navathe, S.: “Fundamentals of Database Systems”.
Addison Wesley. 2004.
Silberschatz, A., Korth, H, Sudarshan, S.: “Database System
Concepts”. McGraw Hill. 2001.
18
Descargar