Técnicas de bloqueo (lock) A cada elemento de datos o gránulo X de la BD se le asocia una variable operación lock_exclusivo(X): deja bloqueado al que lo pide si otro ya tiene cualquier lock sobre X operación lock_compartido(X): deja bloqueado al que lo pide si otro ya tiene un lock exclusivo sobre X operación unlock(X): libera su lock sobre X Antes de leer X ? lock_compartido(X) Antes de escribir (leer) X ? lock_exclusivo(X) Si no se va a leer o escribir más ? unlock(X)
Protocolo deBloqueo en dos fases Una transacción sigue el protocolo de bloqueo en dos fases si nunca hace un lock después de haber hecho algún unlock. Fase de crecimiento: se solicitan locks Fase de devolución: se realizan unlocks Solamente este protocolo de bloqueo garantiza la serializabilidad de transacciones Sin embargo, existe riesgo de deadlock !! Prevención de deadlocks Detección y recuperación de deadlocks
Deadlocks Deadlock (o abrazo mortal o interbloqueo): cuando una transacción T1 está bloqueada esperando a que otra T2 libere un lock, la cual también está bloqueada esperando a que T1 libere uno de sus lock. Se puede generalizar para N transacciones. Prevención de deadlocks Cada transacción obtiene todos los locks al principio y si no puede entonces no obtiene ninguno. Problema de livelock (inanición de algunas transacciones que pueden no obtener todos los que necesiten) Los elementos de la BD están ordenados de alguna manera y los lock hay que obtenerlos en dicho orden. Los programadores deben controlarlo !! Detección y recuperación de deadlocks. A medida que se piden y conceden los lock se construye un grafo de las transacciones que están esperando a otras. Si existe un ciclo en dicho grafo: deadlock. Hay que proceder a abortar a alguna de las transacciones. Problema de livelock si se aborta siempre a la misma!
Técnicas de marcas de tiempo (time-stamping) Un timestamp es un identificador asignado a cada transacción TS(T). Indica la hora de comienzo de la transacción T. A cada elemento X de la BD se le asigna el timestamp de la última transacción que lo ha leído (TS_lect(X)) y escrito (TS_escr(X)) Si una transacción T quiere escribir en X si TS_lect(X) > TS(T) entonces abortar si TS_escr(X) > TS(T) entonces no escribir y seguir en otro caso escribir y TS_escr(X):=TS(T) Una transacción T quiere leer de X si TS_escr(X) > TS(T) entonces abortar si TS_escr(X) < = TS(T) entonces leer de X y TS_lect(X):=máximo(TS(T),TS_lect(X)) Garantiza serializabilidad y ausencia de deadlocks. Puede haber livelock (si se aborta siempre a la misma transacción)
Técnicas optimistas No se realizan comprobaciones ANTES de ejecutar las operaciones (pedir locks, comprobar timestamps), sino al acabar toda la transacción (fase validación) Durante la ejecución de la transacción se trabaja con copias Hay tres fases en un protocolo optimista: Fase de lectura Fase de validación Fase de escritura Es bueno cuando no hay muchas interferencias entre transacciones (por eso son optimistas)
Recuperación en Oracle Redo logs (cíclicos) Archive logs (consolidación de redo logs) Backups Mirrors Export: Incremental, acumulativo (colección de incrementales), total Recuperación basada en cambios, tiempo, paso-a-paso (basado en archive logs), completa
Control de concurrencia en ORACLE (1) Lectura consistente: garantiza que se lean los datos tal y como estaban al inicio de la transacción, sin impedir que otras transacciones los cambien. Implícitamente con SELECT .. FROM T,R … (lo garantiza sobre las tuplas de T,R,…) Explícitamente con SET TRANSACTION READ ONLY; (lo garantiza sobre las tuplas de todas las tablas hasta el fin de transacción.) Debe ser la primera instrucción de la transacción No permitirá hacer ningún INSERT, DELETE o UPDATE en dicha transacción
Control de concurrencia en ORACLE (2) LOCKs Explícitamente con LOCK TABLE T IN x MODE x indica si sobre todas/algunas tuplas de T en modo compartido/exclusivo) Implícitamente con cada operación (según cláusula WHERE) UPDATE, DELETE, INSERT. Se bloquean las tuplas insertadas, borradas o actualizadas (al ser una transacción no finalizada) SELECT…FROM T FOR UPDATE OF atr. Se bloquean las tuplas seleccionadas
Control de concurrencia en ORACLE (y 3) No hay UNLOCK explícitos en ORACLE!! Se realiza un UNLOCK implícito de todos los LOCK con cada COMMIT o ROLLBACK (implícitos o explícitos) Pregunta: ¿Cómo conseguir que las transacciones en ORACLE sigan el protocolo en dos fases, o lo que es lo mismo, sean serializables?
Página anterior | Volver al principio del trabajo | Página siguiente |