3 Concurrence (4 points)
On considère l'exécution concurrente suivante:
H: r1[x] r2[y] r3[x] w3[x] w1[y]
r2[x] c1 c2 c3
- (1 point) Trouvez les conflits dans H et montrez que
H n'est pas sérialisable.
Solution Conflits r1[x]-w3[x],
w3[x]-r2[x], r2[y]-w1[y]
Le graphe de sérialisation contient un cycle T1 ->
T3 -> T2 -> T1, donc H
n'est pas sérialisable.
- (1 point) Trouvez l'exécution obtenue à partir de H par verrouillage à deux phases. On considère que les
verrous d'une transaction sont relâchés au Commit et
qu'à ce moment les opérations bloquées en attente de verrou
sont exécutées en priorité (si elles peuvent recevoir le
verrou attendu).
Solution r1[x] et r2[y] s'exécutent
r3[x] s'exécute (pas de conflit avec r1[x])
w3[x] est bloquée par r1[x]
w1[y] est bloquée par r2[y]
r2[x] s'exécute (pas de conflit avec r1[x] ou avec r3[x])
c1 est bloquée, car T1 est bloquée (w1[y] bloquée)
c2 s'exécute et relâche les verrous de r2[y] et r2[x]
=> w1[y] et c1 sont débloquées et exécutées
=> c1 relâche les verrous de T1
=> w3[x] est débloquée et exécutée
c3 est exécutée
Résultat: r1[x] r2[y] r3[x] r2[x] c2
w1[y] c1 w3[x] c3
- (1 point) Le raisonnement suivant mène à une
conclusion paradoxale. Considérons une histoire quelconque H
non-sérialisable, traitée par verrouillage à deux phases. H contient donc un cycle dans son graphe de sérialisation.
Chaque arc Ti -> Tj de ce cycle provient d'une
paire d'opérations conflictuelles de type ai[x] avant
bj[x]. Quand ai[x] s'exécute, elle prend le
verrou sur x, ce qui bloquera bj[x]. Donc Ti
bloque Tj, mais comme les arcs forment un cycle, il y aura un
blocage circulaire, donc un interblocage. Conclusion: toute
histoire non-sérialisable traitée par verrouillage à deux
phases produit un interblocage!
Cependant, l'exemple précedent montre que cette conclusion est
fausse, car H n'est pas sérialisable et elle ne produit pas
d'interblocage. Expliquez pourquoi il n'y a pas d'interblocage et
pourquoi le raisonnement ci-dessus est faux.
Solution Parmi les 3 conflits, r1[x]
bloque w3[x], r2[y] bloque w1[y], mais w3[x]
ne bloque pas r2[x], car
w3[x] est elle-même bloquée (et donc ne prend pas de verrou).
Donc dans le couple ai[x]-bj[x], ai[x] peut ne pas
bloquer bj[x] si elle-même est déjà bloquée.
- (1 point) Montrez que H n'évite pas les
annulations en cascade. Montrez qu'avec un autre placement des Commit, H peut éviter les annulations en cascade.
Solution r2[x] a lieu après w3[x]
(T2 lit x de T3) avant que T3 se termine, donc
H n'évite pas les annulations en cascade. On peut éviter
les annulations en cascade en plaçant c3 avant
r2[x], ce qui est possible, car la dernière opération de
T3 est avant r2[x].