Procesamiento de Transacciones Material basado en los capítulos 12 y 13 del libro: Sistemas Distribuidos. CyD. G. Coulouris, J. Dollimore and T. Kindberg. Contenido • Mecanismos de Control de Concurrencia – Control de Concurrencia a través de bloqueos – Control Optimista de la Concurrencia – Ordenación por marcas de tiempo – Comparación de métodos. • Recuperación de Transacciones Algoritmo Optimista Se permite que las transacciones procedan, como si no hubiera posibilidad de conflicto con otras transacciones, hasta que el cliente complete su tarea y solicite un EndTransaction. Cuando aparece un conflicto se abortará la transacción. Las modificaciones/accesos se hacen sobre espacios privados o provisionales y se lleva registro de los datos que han sido modificados/accedidos. Al momento del commit, se chequea que los espacios privados sean válidos, de no serlos, se aborta la transacción. A toda transacción se le asigna un identificador (orden secuencial ascendente). Algoritmo Optimista Cada transacción cumple tres fases: Ejecución o Trabajo:Todos los reads se ejecutan inmediatamente sobre la última versión “consumada” del dato. Los writes crean versiones tentativas. Se mantiene un conjunto de lectura (datos leídos) y un conjunto de escritura (versiones tentativas de los datos). No hay posibilidad de “lecturas sucias”, sólo se leen valores consumados. Validación: Ante la solicitud de un commit, se valida si la transacción realizó operaciones conflictivas con otras transacciones. Si la validación tiene éxito se puede hacer COMMIT. Si falla, se debe usar alguna forma de resolución de conflictos (abortar alguna de las transacciones) Algoritmo Optimista Fase de validación (cont.): Ante el End_transaction, a cada transacción se le asigna un número secuencial ascendente, i, que define su posición en el tiempo. Algoritmo Optimista Actualización: Si la transacción logra su validación, todos los cambios realizados sobre los espacios privados se actualizan en las versiones originales. Algoritmo Optimista Fase de validación (Tv): La validación se basa en las siguientes reglas : Tv Ti Regla (i<v) 1. write read Ti no debe leer datos escritos Tv 2. read write Ti no debe escribir datos leídos por Tv 3. write write Ti no debe escribir datos que está escribiendo o haya escrito Tv y Tv no debe escribir datos que está escribiendo o haya escrito Ti Simplificación: fases de validación y escritura son secciones críticas (muy cortas), se supondrá que no pueden solaparse 2 transacciones en estas fases; se satisface la regla 3. Sólo hay que validar las reglas 1 y 2 Algoritmo Optimista Validación hacia atrás: Los reads de las Ti se realizaron antes que la validación (por tanto escritura) de Tv, entonces se cumple la regla 1. Tv Ti Regla (i<v) 1. write read Ti no debe leer datos escritos por Tv 2. read write Ti no haya escrito datos leídos por Tv 3. write write Ti no debe escribir datos que está escribiendo o haya escrito Tv y Tv no debe escribir datos que está 4. escribiendo o haya escrito Ti 5. Reads Tv Writes Ti Algoritmo Optimista Validación hacia atrás: Sólo se valida la regla 2 para cada Ti (Ti(write), Tv(read)): que Tv no haya leído un valor que hayan escrito las Ti. valid= true; for (Ti=startTn+1;Ti<=finishTn,Ti++) { if (“read_set” of Tv intersects “write_set” Ti) valid=false; } startTn: Ti más grande asignado a una transacción committed al momento que Tv entra a su fase de trabajo finishTn: Ti más grande asignado a una transacción committed al momento que Tv entra a su fase de validación Algoritmo Optimista Hay que validar con las Ti que hacen Commit durante la fase de Trabajo de Tv. Sólo es necesario validar los conjuntos de lectura. Las transacciones que sólo hacen escritura no se validan (lo que ella escriba lo validarán otras transacciones mayores posteriormente). Si Tv no es válida, se aborta Algoritmo Optimista Validación hacia atrás: Transacciones anteriores committed T1 T2 T3 Transacción en validación activa1 Tv activa2 Validación Trabajo Escritura Algoritmo Optimista • Validación hacia atrás: requiere que los conjuntos de escritura de las versiones antiguas de los objetos, actualizados por transacciones culminadas, se retengan hasta que no hayan transacciones solapadas, aún no validadas, con la que pudieran entrar en conflicto. • En un entorno con transacciones largas, el mantener estos conjuntos puede ser un problema. Algoritmo Optimista • Validación hacia adelante: el conjunto de escritura de Tv se compara con el conjunto de transacciones activas que se solapan, aquellas que están aún en su Fase de Trabajo. Algoritmo Optimista Fase de validación: La validación se basa en las siguientes reglas : Tv Ti 1. write read Regla (v<i) Tv no debe escribir datos leídos por Ti 2. read write Tv no debe leer datos escritos por Ti 3. write write Ti no debe escribir datos que está escribiendo o haya escrito Tv y Tv no debe escribir datos que está escribiendo o haya escrito Ti Writes Tv Reads Ti Algoritmo Optimista Validación hacia adelante: Se satisface la regla 2 porque las transacciones activas no escriben mientras que Tv no se ha completado. Sólo se valida la regla 1 para cada Ti: se compara el conjunto de escritura de Tv con los conjuntos de lectura de las transacciones activas. valid= true; for (Tid=activa1;Tid<=activaN,Tid++) { if (“write_set” of Tv intersects “read_set” of Ti) valid=false; } Algoritmo Optimista Validación hacia delante: activaX: Representan transacciones que aún no han entrado a la fase de validación Las transacciones que sólo hacen lecturas no requieren ser validadas Opciones si Tv no es válida: Abortar las activas y consumar Tv Abortar Tv Algoritmo Optimista Validación hacia adelante: Transacciones anteriores committed T1 T2 T3 Transacción en validación activa1 Tv activa2 Validación Trabajo Escritura Algoritmo Optimista Desventajas: Hay posibilidad se inanición: una transacción puede abortar indefinidas veces y no se contempla un mecanismo para evitarlo. Este algoritmo no serviría en sistemas con transacciones largas o muchas transacciones en conflicto. Contenido • Mecanismos de Control de Concurrencia – Control de Concurrencia a través de bloqueos – Control Optimista de la Concurrencia – Ordenación por marcas de tiempo – Comparación de métodos. Algoritmo por Marcas de Tiempo Las operaciones se validan al momento en que se están ejecutando. Cuando una transacción comienza, se le asigna un timestamp La regla de ordenación básica por marca de tiempo está basada en los conflictos de operación: Una solicitud de una transacción para escribir un objeto es válida sólo si ese objeto fue leído y escrito por última vez por transacciones anteriores en el tiempo. Una petición de lectura a un objeto no es válida si el objeto fue escrito por última vez por una transacción posterior en el tiempo. Algoritmo por Marcas de Tiempo Se trabaja con versiones tentativas. Las versiones tentativas de los objetos son consumadas en el orden determinado por las marcas de tiempo de las transacciones que las realizaron. Cada item de datos tiene asociado: Un timestamp de escritura (Twrite_commit), un timestamp de lectura (Tread) y un conjunto de versiones tentativas con su propio timestamp Un write aceptado genera una versión tentativa Un read se dirige a la versión con el máximo timestamp menor que el timestamp de la transacción Algoritmo por Marcas de Tiempo Para saber cuando una operación de escritura es válida se aplica el siguiente algoritmo: Sea Tj una transacción que desea hacer una operación de escritura sobre el objeto D. If ((Tj >= Max (Tread en D)) && (Tj > write_commit en D)) Proceder con el write sobre una versión tentativa nueva, con marca de tiempo Tj else // write is too late Abortar Tj; Algoritmo por Marcas de Tiempo Regla de escritura (No se muestran las marcas de lectura) a) T3->write antes después b) T3-> write T2 T2 T3 c) T3->write antes después T1 T1 T4 T3 T4 antes T1 T2 después T1 T2 T3 d) T3-> write antes T4 T3 Aborta después T4 Versión committ Versión tentativa Algoritmo por Marcas de Tiempo Para saber cuando rechazar o aceptar inmediatamente una operación de lectura Sea Tj una transacción que desea hacer un read sobre el objeto D. If ((Tj > Max (Write_Commit en D)) Sea Ds la versión de D con la máxima marca de tiempo de escritura menor a Tj (commited o no) Si se ha consumado Ds: realiza la operación de lectura. Si no, espera hasta que la transacción que hizo la versión Ds haga commit o abort. else // write is too late Abortar Tj; Algoritmo por Marcas de Tiempo Regla de lectura a) T3->read T2 b) T3-> read read se ejecuta inmediatamente Seleccionado (Ds) T2 T4 read se ejecuta inmediatamente Versión committ Seleccionado (Ds) tiempo c) T3->read T1 tiempo Versión tentativa d) T3-> read T2 read espera Seleccionado (Ds) tiempo T4 T3 Aborta tiempo Algoritmo por Marcas de Tiempo • Las versiones commit (consumadas) de cada objeto deben crearse en el orden de las marcas de tiempo. • Un coordinador necesita esperar, a veces, que se completen las transacciones anteriores antes de escribir todas las versiones consumadas de los objetos. La última marca de lectura Corresponde a la transacción T T U a MTL {} MTE S beginT Bal=b.obtenBalance() b.crédito(balance*1.1) a.Débito() Commit BeginT Bal=b.obtenBalance() Espera por T …. … Bal=b.obtenBalance() b.Crédito() b c MTL MTE {} S {T} S,T MTL MTE {} S S,T T T {U} T,U c.Débito() S < T < U. En negritas se colocan las operaciones ya consumadas Algoritmo por Marcas de Tiempo S,U Ejercicio T U T U BeginT BeginT BeginT escribe(i,55) escribe(j,66) X=lee(i) Escribe(j,44) Commit BeginT Escribe(i,55) Escribe(j,66) commit X=lee(i) Escribe(j,44) Ejecute el algoritmo de secuenciación por marcas de tiempo. Las marcas de tiempo iniciales de lectura y escritura son t0. T U BeginT y = lee(k) BeginT Escribe(i,55) Escribe(j,66) x = lee(i) Commit Escribe(j,44) Commit Qué pasa cuándo va a terminar la transacción T si ejecutamos el algoritmo Optimista con validación hacia atrás, hacia adelante??? Se cumple equivalencia secuencial? Transacciones Gestor de Transacciones Planificador del Gestor de Transacciones Equivalencia Secuencial Protocolos para el Control de la Concurrencia Algoritmos por Marcas de Tiempo Algoritmos Optimistas Bloqueos Propiedad de Aislamiento Concurrencia Ejercicio • Para enviar a mas tardar el martes 29 de octubre a: [email protected] • Comparación de todos los métodos de control de concurrencia revisados en clase: • Bloqueos (2 fases, 2 fases estricto, lectores/escritores, bloqueo de dos versiones, control optimista de la concurrencia hacia adelante y hacia atrás y validación por marcas de tiempo). Realice una tabla comentando Ventajas y desventajas. • Debe realizarlo individualmente.