Précédent Index

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. (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 T
    1 -> T3 -> T2 -> T1, donc H n'est pas sérialisable.

  2. (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
    r
    3[x] s'exécute (pas de conflit avec r1[x])
    w
    3[x] est bloquée par r1[x]
    w
    1[y] est bloquée par r2[y]
    r
    2[x] s'exécute (pas de conflit avec r1[x] ou avec r3[x])
    c
    1 est bloquée, car T1 est bloquée (w1[y] bloquée)
    c
    2 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
    c
    3 est exécutée Résultat: r1[x] r2[y] r3[x] r2[x] c2 w1[y] c1 w3[x] c3

  3. (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 a
    i[x]-bj[x], ai[x] peut ne pas bloquer bj[x] si elle-même est déjà bloquée.

  4. (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].

Précédent Index