3 Concurrence (6 points)
Soit l'exécution concurrente suivante de trois transactions dans le SGBD
d'un système bancaire.
H: r1[x] r2[y] w1[y] r3[y] w2[z] w1[x]
c1 r3[x] c2 w3[z] c3
-
(1,5 pt) Parmi les opérations programmées dans le système, il y
a les deux suivantes:
O1: calcul de la somme entre le solde du compte courant et celui du
CODEVI d'un client et enregistrement du résultat dans la base de données.
O2: crédit du compte d'un client et enregistrement de l'opération dans
la base de données.
Montrez que parmi les transactions de H, il y en a qui peuvent
correspondre à O1 et O2. Peut-on dire que dans H apparaît une
exécution concurrente des deux opérations?
Solution:
O1: lecture compte courant, lecture CODEVI, écriture somme
O2: lecture et écriture compte, écriture opération
T1 : r1[x] w1[y] w1[x] c1
T2 : r2[y] w2[z] c2
T3 : r3[y] r3[x] w3[z] c3
T1 est compatible avec O2 et T3 avec O1. Par contre,
on ne peut pas dire que H contient une exécution concurrente de O1
et O2, car y dans T1 correspond à un enregistrement d'opération
bancaire, tandis que dans T3 il est un compte client.
- (1 pt) Vérifiez si H est sérialisable, en
trouvant les conflits et en construisant son graphe de sérialisation.
Solution:
Conflits :
sur x: w1[x] - r3[x]
sur y: r2[y] - w1[y], w1[y] - r3[y]
sur z: w2[z] - w3[z]
Graphe de sérialisation:
T1 ¾® T3 ¬¾ T2 ¾® T1
Pas de cycle, donc H est sérialisable.
- (1 pt) L'exécution H évite-t-elle les annulations en
cascade? Sinon, est-il possible de modifier juste l'emplacement des
Commit afin que H évite les annulations en cascade?
Solution:
H n'évite pas les annulations en cascade, car T3 lit y de T1
avant que T1 soit validée. L'autre lecture (T3 lit x de T1)
se fait après la validation de T1.
Il suffirrait, pour éviter les annulations en cascade, de placer le
Commit de T1 avant la lecture r3[y]. Mais cela n'est pas
possible, car T1 a d'autres opérations après r3[y]. Donc, il
n'est pas possible de déplacer juste les Commit pour éviter les
annulations en cascade.
- (1 pt) On sait que la position des Commit dans une
exécution n'a pas d'influence sur sa sérialisabilité, car seuls les conflits
comptent dans ce cas. Est-ce que l'algorithme de verrouillage à deux phases
est-il également insensible à la position des Commit dans l'exécution?
Justifiez votre réponse.
Solution:
Non, l'algorithme de verrouillage à deux phases est sensible à la position des
Commit, car le relâchement de verrous se fait à ce moment-là seulement.
Donc trop retarder le Commit produira probablement des interblocages.
- (1,5 pt) Quelle est l'exécution obtenue par verrouillage à
deux phases à partir de H?
On considère que le relâchement des verrous d'une transaction se fait au
Commit et qu'à ce moment on exécute en priorité les opérations
bloquées en attente de verrou, dans l'ordre de leur blocage.
Solution:
r1[x], r2[y] s'exécutent
w1[y] bloquée par r2[y]
r3[y] s'exécute, car le verrou de lecture sur y peut être partagé
w2[z] s'exécute
w1[x] bloquée, car T1 bloquée
c1 bloquée, car T1 bloquée
r3[x] s'exécute, car le verrou de lecture sur x peut être partagé
c2 s'exécute et les verrous de T2 sont relâchés. Par contre,
w1[y] ne peut pas être débloquée, car le verrou de lecture sur y et
detenu par T3
w3[z] s'exécute, car le verrou sur z a été relâché par T2
c3 s'exécute et tous les verrous de T3 sont relâchés ®
toutes les opérations bloquées peuvent s'exécuter
w1[y], w1[x], c1 s'exécutent
Résultat : r1[x] r2[y] r3[y] w2[z] r3[x] c2
w3[z] c3 w1[y] w1[x] c1