Cuando se ejecutan varias transacciones concurrentemente en la base de datos, puede
que deje de conservarse la propiedad de aislamiento. Es necesario que el sistema controle la interaccin entre las transacciones concurrentes. Protocolos basados en el bloqueo Se basa en mientras una transaccin accede a un elemento de datos, ninguna otra transaccin puede modificar dicho elemento. Bloqueos a) Compartido: Ti puede leer Q pero no lo puede escribir b) Exclusivo: Ti puede leer y escribir Q Concesin de bloqueos Cuando una transaccin solicita un bloqueo de un modo particular sobre un elemento de datos y ninguna otra transaccin posee un bloqueo sobre el mismo elemento de datos en un modo conflictivo, se puede conceder el bloqueo. Cuando una transaccin Ti solicita un bloqueo sobre un elemento de datos Q en un modo particular M. El gestor de control de concurrencia concede el bloqueo siempre que:
a) No exista otra transaccin que posea un bloqueo sobre Q en un modo que est en conflicto con M. b) No exista otra transaccin que est esperando un bloqueo sobre Qy que lo haya solicitado antes que Ti.
Protocolos de bloqueos en dos fases Un protocolo que asegura la secuencialidad es el protocolo de bloqueo de dos fases. Este protocolo exige que cada transaccin realice las peticiones de bloqueo y desbloqueo de dos fases: a) Fase de crecimiento. Una transaccin puede obtener bloqueos pero no puede liberarlos. b) Fase de decrecimiento. Una transaccin puede liberar bloqueos pero no puede obtener ninguno nuevo.
Implementacin de bloqueos Un gestor de bloqueos se puede implementar como un proceso que recibe mensajes de transacciones y enva mensajes como respuesta. Tabla de bloqueos
El gestor de bloqueos procesa las solicitudes de la siguiente forma:
Cuando llega un mensaje de solicitud, aade un registro al final de la lista enlazada del elemento de datos, si la lista enlazada existe. En otro caso crea una nueva lista enlazada que tan slo contiene el registro correspondiente a la solicitud. Siempre concede la primera solicitud de bloqueo sobre el elemento de datos. Pero si la transaccin solicita un bloqueo sobre un elemento sobre el cual ya se ha concedido un bloqueo, el gestor de bloqueos slo concede la solicitud si es compatible con las solicitudes anteriores, y todas stas ya se han concedido. En otro caso, la solicitud tiene que esperar.
Cuando el gestor de bloqueos recibe un mensaje de desbloqueo de una transaccin, borra el registro para ese elemento de datos de la lista enlazada correspondiente a dicha transaccin. Prueba el siguiente registro, si lo hay, como se describe en el prrafo anterior, para determinar si ahora se puede conceder dicha solicitud. Si se puede, el gestor de bloqueos concede la solicitud y procesa el siguiente registro, si lo hay, de forma similar, y as sucesivamente.
Si una transaccin se interrumpe, el gestor de bloqueos borra cualquier solicitud en espera realizada por la transaccin. Una vez que el sistema de base de datos ha realizado las acciones apropiadas para deshacer la, libera todos los bloqueos que mantena la transaccin abortada.
Este algoritmo garantiza que las solicitudes de bloqueo estn libres de inanicin, dado que una solicitud nunca se puede conceder mientras no se hayan concedido las solicitudes recibidas anteriormente.
Protocolos basados en grafos Implica que el conjunto D se pueda ver como un grafo dirigido acclico denominado grafo de la base de datos. Para simplificar, este apartado centra su atencin slo en aquellos grafos que son rboles con raz. En el protocolo de rbol slo se permite la instruccin de bloqueo bloquear-X. Cada transaccin Ti puede bloquear un elemento de datos al menos una vez y debe seguir las siguientes reglas: El primer bloqueo de Ti puede ser sobre cualquier elemento de datos. Posteriormente, Ti puede bloquear un elemento de datos Q slo si Ti est bloqueando actualmente al padre de Q. Los elementos de datos bloqueados se pueden desbloquear en cualquier momento. Ti no puede bloquear de nuevo un elemento de datos que ya haya bloqueado y desbloqueado anteriormente.
Protocolos basados en marcas temporales Para determinar el orden de secuencialidad es seleccionar previamente un orden entre las transacciones. En el metodo mas comun se usa el metodo ordenacin por marcas temporales. Marcas temporales El sistema de base de datos asigna esta marca temporal antes de que comience la ejecucin de Ti. Si a la transaccin Ti se le ha asignado la marca temporal MT(Ti) y una nueva transaccin Tj entra en el sistema, entonces MT(Ti) < MT(Tj). Existen dos mtodos simples para implementar este esquema:
Usar el valor del reloj del sistema como marca temporal; es decir, la marca temporal de una transaccin es igual al valor del reloj en el momento en el que la transaccin entra en el sistema. Usar un contador lgico que se incrementa cada vez que se asigna una nueva marca temporal; es decir, la marca temporal de una transaccin es igual al valor del contador en el momento en el cual la transaccin entra en el sistema. Las marcas temporales de las transacciones determinan el orden de secuencia. De este modo, si MT(Ti)< MT(Tj) entonces el sistema debe asegurar que toda planificacin que produzca es equivalente a una planificacin secuencial en la cual la transaccin Ti aparece antes que la transaccin Tj. Para implementar este esquema se asocia a cada elemento de datos Q dos valores de marca temporal: marca_temporal-E(Q) denota la mayor marca temporal de todas las transacciones que ejecutan con xito escribir(Q). marca_temporal-L(Q) denota la mayor marca temporal de todas las transacciones que ejecutan con xito leer(Q).
Protocolo de ordenacin por marcas temporales Asegura que todas las operaciones leer y escribir conflictivas se ejecutan en el orden de las marcas temporales. Este protocolo opera como sigue:
1. Supngase que la transaccin Ti ejecuta leer(Q). a) Si MT(Ti) < marca_temporal-E(Q) entonces Ti necesita leer un valor de Q que ya se ha sobrescrito. Por tanto se rechaza la operacin leer y Ti se retrocede. b) Si MT(Ti) marca_temporal-E(Q) entonces se ejecuta la operacin leer y marca_temporalL(Q) se asigna al mximo de marca_temporalL(Q) y de MT(Ti). 2. Supngase que la transaccin Ti ejecuta escribir (Q). a) Si MT(Ti) < marca_temporal-L(Q) entonces el valor de Q que produce Ti se necesita previamente y el sistema asume que dicho valor no se puede producir nunca. Por tanto, se rechaza la operacin escribir y Ti se retrocede. b) Si MT(Ti) < marca_temporal-E(Q) entonces Ti est intentando escribir un valor de Q obsoleto. Por tanto, se rechaza la operacin escribir y Ti se retrocede. c) En otro caso se ejecuta la operacin escribir y MT(Ti) se asigna a marca_temporal-E(Q). Protocolos basados en validacin Cuando los conflictos entre las transacciones son raros se pueden aplicar tcnicas optimistas, evitando los protocolos anteriores (ms costosos). Las fases son, en orden: 1. Fase de lectura. Durante esta fase tiene lugar la ejecucin de la transaccin Ti. Se leen los valores de varios elementos de datos y se almacenan en variables locales de Ti. Todas las operaciones escribirse realizan sobre las variables locales temporales sin actualizar la base de datos actual. 2. Fase de validacin. La transaccin Ti realiza una prueba de validacin para determinar si puede copiar a la base de datos las variables locales temporales que tienen los resultados de las operaciones escribir sin causar una violacin de la secuencialidad. 3. Fase de escritura. Si la transaccin Ti tiene xito en la validacin (paso 2) entonces las actualizaciones reales se aplican a la base de datos. En otro caso, Ti se retrocede. Tratamiento de interbloqueos Existen dos mtodos principales para tratar el problema de los interbloqueos. Se puede utilizar un protocolo de prevencin de interbloqueos para asegurar que el sistema nunca llega a un estado de interbloqueo. De forma alternativa se puede permitir que el sistema llegue a un estado de interbloqueo, y tratar de recuperarse despus a travs de un esquema de deteccin y recuperacin de interbloqueos. Prevencin de interbloqueos El esquema ms simple para la primera aproximacin exige que cada transaccin bloquee todos sus elementos de datos antes de comenzar su ejecucin. Otro esquema para prevenir interbloqueos consiste en imponer un orden parcial a todos los elementos de datos y exigir que una transaccin bloquee un elemento de datos slo en el orden que especifica dicho orden parcial. Deteccin y recuperacin de interbloqueos Para ello, el sistema debe: Mantener informacin sobre la asignacin de los elementos de datos a las transacciones, as como de toda peticin de elemento de datos pendiente. Proporcionar un algoritmo que use esta informacin para determinar si el sistema ha entrado en un estado de interbloqueo. Recuperarse del interbloqueo cuando el algoritmo de deteccin determine que existe un interbloqueo. Otros modelos: Basados en tiempo y grafos de espera. Recuperacin de interbloqueos Cuando un algoritmo de deteccin de interbloqueos determina que existe un interbloqueo, el sistema debe recuperarse del mismo. La solucin ms comn es retroceder una o ms transacciones para romper el interbloqueo. Se deben realizar tres acciones Formas: Seleccin de una vctima (determinar la Ti a retroceder y romper), retroceso (retroceder), inanicin (seleccin factores de coste). Operaciones insertar, borrar Borrar(Q) borra de la base de datos el elemento de datos Q. Insertar(Q) inserta en la base de datos el nuevo elemento de datos Q y le asigna un valor inicial. Verificar si se ejecutar alguna Ti extra. Fenmeno fantasma T29 y T30 no acceden a ninguna tupla comn, y sin embargo estn en conflicto! En efecto, T29 y T30estn en conflicto en una tupla fantasma. Si se realiza el control de concurrencia con granularidad de tupla, no se detecta dicho conflicto. Este problema recibe el nombre de fenmeno fantasma. Coocurrencia en estructura de ndice. La primera tcnica se denomina protocolo del cangrejo: Cuando se busca un valor clave, el protocolo del cangrejo bloquea primero el nodo raz en modo compartido. Cuando se recorre el rbol hacia abajo, adquiere un bloqueo compartido sobre el siguiente nodo hijo. Despus de adquirir el bloqueo sobre el nodo hijo, libera el bloqueo sobre el nodo padre. Repite este proceso hasta que alcanza un nodo hoja.