Está en la página 1de 10

Como saber si una planificación es secuenciable en cuanto a conflictos

La mejor manera es crear un grafo de dependencias lo cual es muy sencillo sabiendo los pasos a
realizar, veamos un ejemplo.

Primero creamos el grafo solo con los nodos, cada nodo representa una de las transacciones.

Ahora vamos a estudiar las dependencias entre las transacciones, hay 3 posibles formas en las que
puede haber una dependencia entre 2 transacciones:

– Una transacción lee un dato que luego sera sobrescrito por otra transacción distinta.
– Una transacción escribe un dato que luego sera sobrescrito por otra transacción distinta.
– Una transacción escribe un dato que luego sera leído por otra transacción distinta.

Simplemente teniendo claro estas 3 situaciones ya podemos crear el grafo de dependencias,


empezamos siempre por la primera instrucción, en nuestro ejemplo la primera instrucción es
generada por la transacción T2 y se trata de leer(B):
Sabiendo los 3 tipos de dependencias que existen observamos que la única que puede afectar a
leer(B) es que haya otra transacción distinta que realice escribir(B) posteriormente, observamos
TODAS las instrucciones posteriores de las transacciones T1 y T3, si encontramos alguna que sea
escribir(B) habremos encontrado una dependencia.

En verde he marcado todas las transacciones posteriores a leer(B) de T2 pertenecientes a las demás
transacciones, ninguna realiza la operación de escribir(B) después de que T2 lea el dato, así que no
hay ningún conflicto con esta instrucción. El grafo continua sin ninguna dependencia.

Una vez hemos acabado con la primera instrucción de la planificación, pasamos a la siguiente, en
este caso se trata de leer(A) de T1, al igual que antes, la única dependencia posible de una
instrucción leer es que otra transacción distinta escriba posteriormente el dato, en este caso, tenemos
que comprobar si alguna de las demás transacciones realiza la instrucción escribir(A)
posteriormente:

En verde he marcado las instrucciones que hay que comprobar, si alguna de estas fuese escribir(A)
habríamos encontrado una dependencia, como se puede observar la instrucción leer(B) de T2 no
hace falta comprobarla ya que es anterior a leer(A) de T1, siempre tenemos que comprobar las
instrucciones posteriores y unicamente de las demás transacciones.
La siguiente instrucción que encontramos es leer(B), también perteneciente a T1, la única
dependencia posible es que otra de las transacciones realice la instrucción escribir(B)
posteriormente.

En esta ocasión si que encontramos una dependencia, cuando esto ocurre creamos una arista que va
desde la transacción que estamos estudiando hasta la que contiene la instrucción que causa la
dependencia, en este caso concreto, crearemos una arista que va desde T1 a T2. Esto representa que
para que no haya conflictos si se realizaran secuencialmente, la planificación T1 debería ejecutarse
antes que la T2.

Pasemos a la siguiente instrucción de la planificación, en este caso vamos a analizar leer(B) de T3,
como en los casos anteriores de lectura buscamos si existe alguna instrucción posterior en las demás
transacciones del tipo escribir(B).

Volvemos a encontrar otra dependencia, en este caso T2 tendrá que ejecutarse tras T3 para no
generar ningún conflicto, representamos esto en el grafo de dependencias.
Pasamos a la siguiente instrucción, en este caso se trata de escribir(A) de la transacción T1, si
echamos un vistazo a las posibles dependencias veremos que cuando se trata de escribir un dato,
habrá una dependencia si posteriormente otra transacción lee o escribe el mismo dato, en este caso
buscaremos en las demás transacciones si aparece algún leer(A) o escribir(A).

Encontramos una dependencia en T3, ya que realiza la operación leer(A) posteriormente a


escribir(A) de T1. Para que no ocurra ningún conflicto, T3 tendrá que ejecutarse siempre después de
T1 en una planificación secuencial, esto lo representamos con una arista en el grafo de
dependencias.

Pasamos a la siguiente instrucción que se trata de escribir(B) de T2, como en el caso anterior habrá
una dependencia si encontramos algún leer(B) o escribir(B) en otra de las transacciones en un
momento posterior.
Se puede ver fácilmente que no hay ninguna ya que la única instrucción de leer/escribir que queda
es leer(A) de T3, comprobamos esta ultima finalmente y ya podemos dar por concluido el análisis
de la planificación en cuanto a dependencias.

El grafo de dependencias obtenido es este:

¿Como sabemos si una planificación es secuenciable en cuanto a conflictos observando el grafo de


dependencias?
La condición única e indispensable para saber si una planificación es secuenciable en cuanto a
conflictos dado un grafo de dependencias es que NO EXISTA ningún ciclo en el grafo, en nuestro
caso podemos afirmar que la planificación analizada es secuenciable en cuanto a conflictos.
De hecho analizando el grafo observamos que la planificación secuencial equivalente en cuanto a
conflictos es aquella en la que la transacción T1 es la primera en ejecutarse, seguida de la T3 y por
ultimo, la T2.

Si existiese algún ciclo en el grafo la planificación no seria secuenciable en cuanto a conflictos,


veamos unos ejemplos:

En una planificación secuencial el primer grafo necesitaría que T1 se ejecutase antes que T2 para
que no hubiese conflictos, pero también necesitaría que T2 se ejecutase antes que T1, lo cual es
incompatible .
En el segundo grafo ocurre lo mismo, existe un ciclo que engloba a las 3 transacciones, lo cual
impide ordenarlas de forma secuencial, ya que cada una de ellas necesita que otra se ejecute antes
para que no hubiese conflictos con los datos.

Como saber si una planificación es secuenciable en cuanto a vistas

Lo mejor es analizar primero si la planificación es secuenciable en cuanto a conflictos ya que toda


planificación secuenciable en cuanto a conflictos también es secuenciable en cuanto a vistas,
pero lo contrario no es cierto, existen planificaciones secuenciables en cuanto a vistas que no son
secuenciables en cuanto a conflictos.

Si la planificación no es secuenciable en cuanto a conflictos, tendremos que analizarla “a mano”


para ver si lo es en cuanto a vistas, esto ocurre si logramos encontrar una planificación secuencial
que cumpla las siguientes reglas:

– Si una transacción lee el valor inicial de un dato en una planificación concurrente, la


transacción debera leer el mismo valor inicial en la planificación secuencial.
– Siempre que una transacción lea un dato escrito por otra transacción en la planificación
concurrente, debemos de asegurarnos que cuando la transacción lea el dato en la
planificación secuencial, este tiene que haber sido escrito por la misma transacción y en la
misma operación que lo escribió antes en la concurrente.
– Si una transacción es la ultima que escribe un dato en una planificación concurrente, la
misma transacción es la que deberá escribir el dato por ultima vez en la planificación
secuencial.

Al final todo se reduce a jugar con las transacciones disponibles para encontrar una manera de
ordenarlas secuencialmente cumpliendo las reglas anteriores, si tenemos n transacciones existen n!
formas distintas de ordenarlas secuencialmente. Veamos un ejemplo:

T1 T2
leer(A)
escribir(A)
leer(A)
escribir(A)
leer(B)
escribir(B)
leer(B)
escribir(B)
escribir(B)

Hay que analizar las transacciones para ver si cumplen las reglas anteriores, personalmente
encuentro que lo más fácil es comprobar inicialmente la primera y tercera regla ya que nos permitirá
descartar muchas secuencias posibles.
En nuestro ejemplo solo hay 2!=2 planificaciones secuenciales posibles, estas son T1 seguido de T2
y T2 seguido de T1.
En este caso la primera regla nos obliga a que la planificación secuencial en cuanto a vistas
equivalente debe respetar que si T1 lee el valor inicial de A en la planificación concurrente, también
lo debe de hacer en la secuencial. Como T2 escribe sobre A debemos asegurarnos que T1 se ejecute
antes que T2 en la secuencial por lo que la única planificación secuencial posible que cumple esta
regla es la de T1 seguida de T2, comprobamos que leer B también requiere que T1 se ejecute antes
que T2:

T1 T2
leer(A)
escribir(A)
leer(B)
escribir(B)
escribir(B)
leer(A)
escribir(A)
leer(B)
escribir(B)

Comprobemos ahora la tercera regla, según la tercera regla la transacción que escribe un dato por
ultima vez en la planificación concurrente tiene que ser la misma que en la planificación secuencial.
En nuestro ejemplo tanto T1 como T2 usan la instrucción escribir(A), siendo T2 la ultima
transacción que lo hace, lo cual se cumple con la planificación secuencial T1-T2.
También ambas realizan la instrucción escribir(B) siendo T1 la ultima que lo hace por lo que T1
debería ejecutarse después de T2, como esto es incompatible con la aplicación de las demás reglas
que nos obligan a que T1 se ejecute antes que T2 podemos afirmar que la planificación concurrente
original no es secuenciable en cuanto a vistas.

Veamos otro ejemplo:

T1 T2 T3
leer(Q)
escribir(Q)
escribir(Q)
escribir(Q)

Tenemos 3 transacciones, por que existen 3!=3x2=6 planificaciones secuenciales posibles

T1 T2 T3
T1 T3 T2
T2 T1 T3
T2 T3 T1
T3 T1 T2
T3 T2 T1
Empezamos comprobando la primera regla, en este caso la lectura del dato Q inicial es realizada por
T1, pero como tanto T2 como T3 escriben Q, T1 tendrá que ser la primera ejecutarse para respetar
que T1 lea el valor inicial de Q y no un valor sobrescrito. Nos quedan las siguientes posibles
planificaciones:

T1 T2 T3
T1 T3 T2

Aplicamos ahora la tercera regla, las 3 transacciones realizan la instrucción escribir(Q), pero para
respetar la tercera regla, T3 tiene que ser la ultima en ejecutarse para segurar que sea la ultima que
realiza la escritura igual que en la planificación concurrente original, de esta manera ya tan solo nos
queda una única planificación posible:

T1 T2 T3

Para cumplir la segunda regla hay que buscar instrucciones de lectura que hayan leido un dato
previamente escrito por otra instruccion y comprobar que en la planificación secuencial se cumple
que el dato que se lee ha sido escrito por la misma instrucción que lo escribio en la concurrente.
En nuestro ejemplo no hay ninguna instrucción de lectura distinta de la inicial, por lo que la
planificación secuencial posible es valida y se puede afirmar que la planificación original es
secuencial en cuanto a vistas.

Veamos por ultimo un ejemplo más complejo

T1 T2 T3 T4 T5
leer(A)
leer(B)
escribir(A)
leer(A)
escribir(B)
leer(A)
leer(B)
escribir(B)
escribir(A)
escribir(A)

Tenemos 5 transacciones por lo que existen 5!=5x4x3x2=120 planificaciones posibles, parece una
barbaridad pero en cuanto apliquemos un par de las reglas descartaremos muchas de ellas.

Aplicamos la primera regla que nos indica que se debe respetar que si una transacción lee el valor
inicial de un dato en la planificación concurrente, debe también leer el valor inicial en la secuencial.
En nuestro caso hay 2 datos distintos, el dato A y el dato B, el dato A lee el valor inicial en la
transacción T1 siendo el único leer(A) que lee este dato, encontramos otros leer(A) en T2 y T3 pero
no leen el inicial, ademas encontramos escribir(A) en T2, T3 y T4, por lo que según la primera regla
T1 tiene que ir en la planificación secuencial antes que todas ellas. El dato B inicial se lee en T3, en
T5 encontramos otro leer(B) pero sobre un valor previamente sobrescrito, tanto en T4 como en T5
aparecen escribir(B), por lo cual en la planificación secuencial T3 tiene que ejecutarse antes que T4
y T5.
Resumiendo: T1 se ejecuta antes que {T2-T3-T4} y T3 antes {T4,T5}.

Aplicamos ahora la tercera regla que nos indica que se debe respetar que la ultima transacción que
escriba un dato tiene que ser la misma tanto en la planificación concurrente como en la secuencial.
En nuestro caso escribir(A) se ejecuta por ultima vez en T4, pero se ejecuta también en T1 y T2, por
lo que T4 ira detrás de estas dos. Escribir(B) se ejecuta por ultima vez en T5 y antes se ejecuta en
T4, por lo que T5 ira detrás de T4.
Resumiendo:{T1-T2} se ejecutan antes que T4, T4 se ejecuta antes que T5.

Con los datos conocidos ya podemos conocer el orden en que se ejecutaran algunas transacciones
en una posible planificación secuencial valida:
T1 se ejecuta antes que {T2,T3,T4}, y T3 antes que {T4,T5] por lo que por lógica T1 tiene que ir
también delante de T5, ya sabemos que T1 solo podría ir en la primera posición si existe una
planificación secuencial valida.

T1 ? ? ? ?

{T1-T2} se ejecutan antes que T4, T4 se ejecuta antes que T5 por lo que T1 y T2 también, y T3 se
ejecuta antes que {T4,T5} por lo que T5 solo puede ser la ultima.

T1 ? ? ? T5

De las 6 transacciones que quedan sabemos que T2 y T3 se tienen que ejecutar antes que T4, lo cual
nos deja estas posibles combinaciones:

T1 T2 T3 T4 T5
T1 T3 T2 T4 T5

Hemos reducido las posibles planificaciones secuenciales de 120 a 2 aplicando 2 de las 3 reglas,
apliquemos ahora la ultima para finalizar.
Según la segunda regla, siempre que una transacción concurrente lea un dato que haya sido escrito
por otra transacción, cuando el dato se lea en la planificación secuencial equivalente por la
transacción que lo leyó originalmente, este debe de haber sido escrito por la misma operación que lo
escribió originalmente.
En nuestro ejemplo no nos interesa ni el leer(A) de T1, ni el leer(B) de T, ya que no han sido
escritos anteriormente por ninguna otra transacción y leen los datos iniciales, nos centraremos en el
leer(A) de T2, en el leer(A) de T3 y en el leer(B) de T5.
El leer(A) de T2 lee el dato escrito por ella misma, así que no esto no va a ocasionar ningún
problema en la planificación secuencial, siempre se va a cumplir. El leer(A) de T3 lee el dato A
escrito por T2, por lo que no solo debe ejecutarse tras esta sino que también debemos asegurarnos
que ninguna otra transacción que escriba A se encuentre entre T2 y T3 ya que entonces leería un
dato distinto al original, en nuestro caso ademas de T2, tanto T1 como T4 escriben el dato A,
ninguna de estas transacciones pueden colocarse entre T2 y T3. Esta ultima regla descarta una de las
dos planificaciones posibles, la que colocaba T2 después de T3. Por ultimo, el leer(B) de T5 lee el
dato escrito por T4, por lo cual sigue siendo compatible con nuestra planificación y hemos
encontrado una planificación secuencial en cuanto a vistas equivalente, podemos afirmar que la
planificación concurrente original es también secuenciable en cuanto a vistas.
T1 T2 T3 T4 T5

T1 T2 T3 T4 T5
leer(A)
escribir(A)
escribir(A)
leer(A)
leer(B)
leer(A)
escribir(B)
escribir(A)
leer(B)
escribir(B)

Se puede comprobar mediante el grafo de dependencias que la planificación no es secuenciable en


cuanto a conflictos pero si es secuenciable en cuanto a vistas.

También podría gustarte