Exercices du 6 avril 2005
Exercices IBD 1 / 3
Séance d'Exercices IBD N°3
Exercice1 : concurrence
Soit T1 et T2 les transactions suivantes:
Transaction T1
Read (a) a:=a+100;
write(a);
read(b) b:=b+100;
write(b);
Transaction T2
Read (a) a:=a*2;
write(a);
read(b) b:=b*2;
write(b);
a) si la valeur initiale de a est 25 et celle de b est 25, quelles sont leurs valeurs de a et b si on
exécute les transactions à la suite, T1 puis T2.
a=b=250
b) Quelles sont les valeurs si on exécute T2 puis T1?
a=b=150
c) maintenant les deux transactions sont exécutées de façon concurrente de la façon suivante:
Transaction T1
Read (a) a:=a+100;
write(a);
read(b) b:=b+100;
write(b);
Transaction T2
Read (a) a:=a*2;
write(a);
read(b) b:=b*2;
write(b);
Si on considère les mêmes valeurs initiales qu'en a) quelles sont les valeurs de a et b à l'issue de l'éxécution des transactions?
a=b=250
Cette exécution entremêlée est elle correcte, pourquoi?
L'exécution concurrente de T1 et T2 donne le même résultat que T1 puis T2. Correcte !
d) Si les deux transactions sont exécutées de façon concurrente de la façon suivante:
Transaction T1
Read (a) a:=a+100;
write(a);
read(b) b:=b+100;
write(b);
Transaction T2
Read (a) a:=a*2;
write(a);
read(b) b:=b*2;
write(b);
Exercices du 6 avril 2005
Exercices IBD 2 / 3
Si on considère les mêmes valeurs initiales qu'en a) quelles sont les valeurs de a et b à l'issue de l'exécution des transactions?
a=250 et b=150
Cette exécution entremêlée est elle correcte, pourquoi?
L'exécution concurrente de T1 et T2 ne donne pas le même résultat que T1 puis T2 ou T2 puis T1. Incorrecte ! Exercice2 : concurrence
Notre système utilise le protocole de verrous exclusifs avec libération explicite. Supposons l'exécution suivante des transactions T1 et T2:
Transaction T1 Transaction T2
t1 XRead (a)
t2 a:=a+100; XRead (a) t3 mise en attente t4 write(a);
t5
t6 XRelease (a) a:=a*2;
t7 write(a);
t8 XRelease (a) t9
t10 Xread(b)
t11 b:=b+100; Xread(b) t12 mise en attente t13 write(b);
t14
t15 XRelease (b) b:=b*2;
t16 write(b);
t17 XRelease (b)
a) Cette exécution se passe t'elle correctement? Quels sont les problèmes possibles en cas d'échec
de T1?
Si T1 se passe bien (Commit), alors l'exécution de T2 fournit un résultat correct.
Si T1 se passe mal (RollBack), alors T2 utilisera des données incorrectes (lectures avant le RollBack) et écrira des informations incorrectes dans la base.
b) Proposez une solution à ce problème.
Toutes transactions qui dépendent d'une transaction annulée doivent être annulées. Il s'agit donc de surveiller les Commit/RollBack des transactions.
Exercice3 : concurrence
Soit les deux transactions T1 et T2.
T1:
Xread(a) a:=a+2;
Write(a);
Xread(b);
b:=b*3;
Write(b) XRealease(a) XRealease(b);
T2:
Xread(b) b:=b*2;
Write(b);
Xread(a);
a:=a+3;
Write(a) Xrealease(a) Xrealease(b);
Pouvez vous proposer une exécution concurrente pour ces deux transactions? Justifiez votre réponse.
Exercices du 6 avril 2005
Exercices IBD 3 / 3
Il y a manifestement interblocage ! Les commandes Xread(b) de T1 et Xread(a) de T2 s'attendent mutuellement et aucune de peut libérer a ou b.
Le problème réside dans la position des Xrealease qui sont tous en fin de transaction. Pour T1, Xrealease(a) devrait remonter avant le Xread(b). (Idem pout T2 avec Xrealeas(b).