3 ejercicios de competición corregidos

Los problemas de concurrencia son comunes en una base de datos. El bloqueo y el estampado son dos técnicas para evitarlos. A continuación se muestran ejercicios corregidos sobre este tema.

competencia

Preámbulo

Expresión de restricciones
—————————

0. Preámbulo de PL/SQL
SQL:
– Declarativo por lo tanto sin estructuras de control (bucles, condiciones, etc.)
– Operaciones de conjunto de datos
=> Pocas aplicaciones se pueden lograr mediante una simple secuencia de consultas SQL; necesidad de enriquecer SQL con capacidades procesales.
3 posibilidades
– SQL incorporado (PRO*C…)
– API de comunicación (SQL-CLI…)
– Lenguaje dedicado (PL/SQL…)

Ventaja de los lenguajes dedicados: Procedimientos ejecutados en el lado del servidor -> Sólo los resultados se devuelven al cliente -> Intercambios de red mínimos

P0. Procedimientos PL/SQL

P0.1
CREAR O REEMPLAZAR EL PROCEDIMIENTO D
(noc EN CUENTAS.Numero%TYPE,
crédito EN NÚMERO )
ES
COMENZAR
ACTUALIZAR CUENTAS ESTABLECER SALDO = SALDO – débito
DONDE Número = noc;
FIN;
/

P0.2
CREAR O REEMPLAZAR EL PROCEDIMIENTO C
(noc EN CUENTAS.Numero%TYPE,
crédito EN CUENTAS.Saldo%TYPE)
ES
COMENZAR
ACTUALIZAR CUENTAS ESTABLECER SALDO = SALDO + crédito
DONDE Número = noc;
FIN;
/

P0.3
CREAR O REEMPLAZAR EL PROCEDIMIENTO S
(noc EN CUENTAS.Número%TYPE)
ES
elSaldo CUENTAS.Saldo%TYPE;
COMENZAR
SELECCIONE el saldo EN theBalance
DE CUENTAS
DONDE Número = noc;
DBMS_OUTPUT.PUT_LINE(elSaldo);
FIN;
/

P0.4
CREAR O REEMPLAZAR EL PROCEDIMIENTO V
(no de EN CUENTAS.Numero%TYPE,
noto EN CUENTAS.Numero%TYPE,
trans EN CUENTAS.Saldo%TYPE)
ES
COMENZAR
D (no de, trans);
C (noto, trans);
FIN;
/

P0.5
CREAR O REEMPLAZAR FUNCIÓN comprobar
(noc EN CUENTAS.Numero%TYPE,
importe EN CUENTAS.Saldo%TYPE)
VOLVER BOOLEANO
ES
es Solvente BOOLEAN;
elSaldo CUENTAS.Saldo%TYPE;
COMENZAR
SELECCIONE el saldo EN theBalance
DE CUENTAS
DONDE Número = noc;
SI Saldo >= monto ENTONCES
essolvente := VERDADERO;
DEMÁS
esDisolvente := FALSO;
TERMINARA SI;
RETORNO es Solvente;
Comprobación FINAL;

Ejercicio 1

Pregunta 1

Para evitar posibles problemas de concurrencia, el administrador opta por ejecutar las transacciones en serie. Consideramos el caso de dos transacciones simultáneas en la cuenta X, cuyo saldo inicial es de 1000 euros. Ambos son débitos, el primero son 400 euros, el segundo son 800 euros.

En el preciso momento en que T1 inicia su flujo, comienza T2.

Qué esta pasando ?

¿Cómo podemos acelerar la ejecución de estas transacciones?

Pregunta 2

Seis administradores de cuentas bancarias realizan cada uno, en una transacción y simultáneamente, operaciones en 4 cuentas A, B, C y D. Sea Ei(A) una operación de escritura en la cuenta A por parte del administrador i, y Li( A) a operación de lectura de la cuenta A por parte del administrador i. Considere la siguiente secuencia de operación: E2(A), L2(B), L6(D), E5(C), E3(A), L5(A), L1(C), L2(D), L3(C) , E4(C), E3(D), L4(B), L1(B).

  1. Constrúyelo grafico precedencia de estas transacciones.
  2. ¿Qué problemas de ejecución podrían surgir?
  3. ¿Esta ejecución es serializable?
P1. Restricciones
Recordatorios de restricciones
  tiene. Al definir el esquema (verificar)
  b. Mediante el comando CREAR ASERCIÓN:
    El programador define lo que siempre debe ser cierto. 
    El DBMS identifica las modificaciones de la base de datos que pueden afectar las restricciones y no las hace efectivas si violan una restricción.
  vs. Mediante el uso de Trigger (reglas de Evento-Condición-Acción):
    El programador define las reacciones del DBMS a los cambios de la base de datos.
    El DBMS los aplica.
 
  tiene. Al definir el esquema:
  CREAR TABLA DE CUENTAS (
    Número INT CLAVE PRIMARIA,
    …,
    VERIFICACIÓN DE SALDO FLOTANTE (Saldo>=0 Y (TIPO <> 'Ahorros' O Saldo <= 2000))
  )
 
  b. Afirmación
  CREAR ASERCIÓN BonSoldeAssert VERIFICAR 
  (2000 <= TODOS(Seleccione Saldo DE CUENTAS DONDE Tipo='Ahorros') Y 0> (Seleccione Saldo DE CUENTAS)
  
  vs. Desencadenar
  CREAR GATILLO BonSale
  ANTES DE INSERTAR O ACTUALIZAR LAS CUENTAS 
  POR CADA FILA
  CUANDO (:NEW.Balance<0 OR (:NEW.Balance>2000 AND :NEW.Type='Ahorros'))
  ABORTAR TRANSACCIÓN;
 
P2. Observación de transacciones
 
T1: A<-1500
Pantallas: “A<-1500” — TODO: ¿Está realmente sucediendo la pantalla?
A<-2100 ==> Viola la restricción “el saldo del tipo de ahorro implica un saldo <2000”
==> Aborto de toda la transacción (Revertir)
==> Un<-1000
 
T2: A<-700
B<-1300
COMPROMETERSE
 
T3: A<- -900 ==> Viola la restricción “saldo >= 0”
==> Aborto de toda la transacción
 
T4: Muestra “A<-700”
Póster “B<-1300”

Ejercicio 2

Pregunta 3

Nos situamos en el caso del bloqueo, con gránulo de nivel tupla.

Demuestre que el algoritmo de bloqueo “detecta” el problema de esta ejecución. ¿Cuál sería el algoritmo de resolución de conflictos más adecuado para esta ejecución?

Transacción: Secuencia de operaciones (Lectura – Escritura) aplicables a una BD; cuatro palabras clave: comienza con BEGIN, termina correctamente con COMMIT, falla con ABORT, se deshace con ROLLBACK.
 
Propiedades de la transacción:
Atomicidad: una transacción se ejecuta por completo o no se ejecuta en absoluto
Coherencia: Una transacción mueve la base de datos desde un estado consistente – donde se verifican las restricciones (integridad y otras) – a un estado consistente.
Aislamiento: No hay interacción entre transacciones ejecutadas en paralelo.
D urabilidad: No hay pérdida de resultados de una transacción ejecutada.
 
ACID asegurado por: Tolerancia a fallos (A, C y D) + Control de concurrencia (principalmente I, pero I tiene repercusiones en C y D)
 
P3.
Solución trivial: se ejecuta 1 transacción a la vez en la base de datos bloqueada. 
T1 luego T2
 
Problemas de rendimiento: Leer el mismo objeto, escribir objetos diferentes, son acciones que no comprometen el aislamiento -> Posibilidad de paralelizar transacciones.
Para mejorar el rendimiento: intercale la ejecución asegurándose de que la ejecución intercalada sea equivalente a la ejecución en serie.
 
Ilustración del problema de intercalado de ejecución con Q4:
control de competencia
Sin un mecanismo de control de concurrencia, las ejecuciones no son deterministas: el resultado depende del orden de las operaciones entre transacciones (lecturas/escrituras)

Ejercicio 3

Pregunta 4

Sugerir un algoritmo algoritmo de lectura y escritura con estampación. ¿Estamos seguros de que esta ejecución sea serializable con el sistema de estampado? Demuestre que esto es cierto para cualquier ejecución no serializable.

Pregunta 5

Compare las dos familias de técnicas vistas anteriormente (bloqueo y estampado). ¿El algoritmo de estampado simple es más adecuado para esta ejecución que el bloqueo?

P4. Gráfico de precedencia

El mecanismo de control de la competencia debe proporcionar a cada transacción la ilusión de que es la única que se ejecuta en la BD, es decir, la ejecución efectiva (por lo tanto entrelazada) de las transacciones debe ser equivalente a una ejecución en serie de éstas (ejecución: secuencia ordenada de lecturas). /operaciones de escritura).
Las ejecuciones equivalentes a una ejecución en serie se denominan serializables. El mecanismo de concurrencia debe garantizar que solo genere ejecuciones serializables.

Ejecución: secuencia ordenada de operaciones de lectura/escritura por diferentes transacciones.
Ejecución en serie: Las operaciones de diferentes transacciones no se entrelazan.

control de competencia

¿Es posible reordenar la ejecución para que sea serial?

No, porque es imposible intercambiar entradas con cualquier otra operación -> Induce una relación de precedencia entre transacciones.

Más formalmente:
Ti precede a Tj (“Ti < Tj”) si Ai ocurre antes

Aj en la ejecución Ai y Aj implican el mismo objeto del BD

Ai o Aj es una acción de escritura.

Esta relación de precedencia genera el gráfico de precedencia, en el que un vértice es una transacción y una arista dirigida es una relación de precedencia.

Por ejemplo: Ti -> Tj significa que Ti precede a Tj

Vista por objeto de operaciones (más simple que la vista global, pero pierde el orden de las operaciones dentro de una transacción):

A: E2(A) E3(A) L5(A)

B: L2(B) L4(B) L1(B)

C: E5(C) L1(C) L3(C) E4(C)

D: L6(D) L2(D) E3(D)

Gráfico de precedencia:

T2 -> T3 <-> T5 -> T1 -> T4

T6 ->|

Propiedad del gráfico de precedencia:

Ejecución serializable si no hay ciclo (por ejemplo, arriba, T3 debe realizarse antes que T5, que debe realizarse antes de T3)

Problema: la detección de ciclos es NP completa (no determinista, polinómica, difícil)

Observó:

Propiedad de aislamiento = Las transacciones deben ejecutarse AS si estuvieran solas en la base de datos. La serialización garantiza que el resultado de una ejecución intercalada sea el mismo que el de una ejecución en serie. Pero la serialización no es una condición suficiente para garantizar que las transacciones se ejecuten de forma aislada.

Ejemplo de ejecución serializable no aislada (ABORTO en cascada):

T1 < T2 < … < Tn

control de competencia

P5. Mecanismo de aislamiento más utilizado: bloquear y desbloquear

Protocolo de bloqueo más utilizado: Bloqueo bifásico

Fase 1: se adquieren todos los bloqueos, no se realiza ningún desbloqueo

Fase 2: se completan todos los desbloqueos, no se adquieren bloqueos

Propiedad: Garantiza la serialización de la ejecución de un cronograma legal (es decir, lock1(X) no puede ir seguido de lock2(X) sino de unlock1(X))

Cuatro tipos de bloqueos: compartido VS exclusivo/corto VS largo (consulte la matriz de compatibilidad indicada)

Dos tipos de operación: Lectura y Escritura.

Diferentes grados de aislamiento:

* Grado 0 (Leer no comprometido):

Instalación de bloqueos exclusivos de escritura corta.

-> Lee incluso objetos modificados por transacciones que no se han comprometido

* Grado 1 (Lectura comprometida):

Instalación de bloqueos exclusivos de escritura larga.

Establecer bloqueos de lectura compartidos breves

-> Solo leer objetos modificados por transacciones confirmadas

* Grado 2 (Lectura Repetible):

Grado 1 + Instalación de bloqueos de lectura compartidos largos

-> Lectura repetible

* Grado 3 (Serializable):

Nivel 2 + Elimina fantasmas

El bloqueo “detecta” el problema de serialización: puntos muertos

control de competencia

Varias formas de gestionar los puntos muertos

* TimeOut: elimina las transacciones que tardan más de x segundos en ejecutarse

* Detección: Gráfico de espera

T5 <-> T3

   <- T1

   <- T4

   Gráfico construido a medida que avanza la ejecución

   Revertir cualquier transacción que pueda causar que aparezca un ciclo en el gráfico de espera

   Ejemplo: 1. T5 -> T3 2. T1 -> T5 -> T3 3. T1 -> T5 <-> T3 ==> Reversión de T3

   Problema: La detección del ciclo siempre es NP completa; puede ser largo si el gráfico es ancho

* Prevención: Marcas de tiempo

   Da prioridad a las transacciones antiguas para evitar que se produzcan bloqueos.

   Marca de tiempo asociada a cada transacción.

   T1 quiere adquirir un bloqueo sobre un objeto bloqueado por T2.

   Solución 1: esperar y morir

si T1 es mayor que T2, T1 espera

de lo contrario, T1 Rollback (y se reinicia con la misma marca de tiempo)

   Solución 2: Wound-Wait (espera transacciones antiguas)

si T1 es anterior a T2, T2 debe abandonar el bloqueo y revertir

de lo contrario, T1 espera

    -> Nunca interbloquear: T1 acabará siendo el más antiguo y por tanto se ejecutará con prioridad.

   Esperar-morir VS Herir-esperar:

      Candados adquiridos al inicio de una transacción -> Es más probable que las transacciones antiguas tengan sus candados antes que las nuevas

      -> Espera de herida: causa poca reversión porque ver suposición

         Esperar-morir provoca una gran cantidad de retroceso porque se supone que es así; pero cada vez al comienzo de transacciones jóvenes

Sellos:

T2:1 T6:2T5:3T3:4T1:5T4:6

Espera-muere:

esperar-morir

Sellos:

T2:1 T6:2T5:3T3:4T1:5T4:6

Espera de herida:

espera-herida

P5.b.
Bloqueo altruista: una transacción libera sus bloqueos cuando ya no los necesita.
+: Efectivo
– : (i) Problema de lectura sucia; (ii) Ejecución a priori no 2PL, por lo tanto a priori no serializable.

cerradura altruista

P6.
Sistema de estampado: Asigna un sello a cada transacción (generalmente la marca de tiempo de su creación), impide el acceso a objetos contrarios al orden de los sellos -> Prioridad a transacciones jóvenes. Las transacciones que llegan tarde se revierten y se reinician con una nueva marca de tiempo. Parte de la familia de protocolos optimistas, es decir, un método eficaz cuando hay pocos conflictos debido a pocos gastos generales, pero potencialmente mucha reversión.

Dos reglas:

Leer demasiado tarde: una transacción solo puede leer datos si es más reciente que el último escritor

Escribir demasiado tarde: una transacción solo puede escribir datos si es más joven que el último lector y escritor.

estampado

Algoritmo básico:

– Colocar sello en cada transacción.

– Cada objeto conserva el sello del último lector así como el del último escritor

– Cuando Ti quiere leer el objeto O:

Si el sello < O.LastWriter: Leer demasiado tarde -> Ti ROLLBACK luego se reinicia con un nuevo sello

De lo contrario está bien

– Cuando Ti quiere escribir el objeto O:

Si Ti.stamp < O.LastReader || Ti.stamp < O.LastWriter: Escribir demasiado tarde -> Ti ROLLBACK luego se reinicia con un nuevo sello

De lo contrario está bien

Ejemplo:

Sellos:

T2: 1-8 T6: 2T5: 3-7T3: 4T1: 5T4: 6

Objetos:

A (L: ; E: 1) A (L: ; E: 4)

segundo (l: 1; mi: )

C (L: 5; E: 3-6) C (L: 5; E: 6)

D (L: 2; E: 4)

estampado

Los gráficos de precedencia de ejecuciones de estampado nunca tienen un ciclo.

Prueba por absurdo:

Considere el gráfico de precedencia cíclica de una ejecución obtenida mediante estampación:

T1 -> … -> Ti <-> Tj -> … -> Tn => Ti < Tj < Ti

<=> yo < j < yo

Contradicción

P8.

Estampar bien cuando hay pocos conflictos (sin esperas); malo cuando hay muchos conflictos (muchas reversiones).

Buen bloqueo cuando hay muchos conflictos (menos retroceso que estampado); malo cuando hay pocos conflictos (esperas innecesarias, gastos generales de administración de bloqueos).

Los sistemas comerciales intentan combinar las ventajas de ambos: estampado multiversión (una variación del estampado único discutido anteriormente) para transacciones de solo lectura y bloqueo 2PL para transacciones de lectura/escritura. (ver pág. 978 de “DB Systems: el libro completo” de Widom y Ullmann)