Le programme suivant s'exécute dans un système de gestion de commandes pour
les produits d'une entreprise. Il permet de commander une quantité donnée
d'un produit qui se trouve en stock. Les paramètres du programme représentent
respectivement la référence de la commande (c), la référence du produit (p)
et la quantité commandée (q).
Commander (c, p, q)
Start
Lecture prix produit p
siq > stock de palorsAbort
sinon
Mise à jour stock de p
Enregistrement dans c du total de facturation
Commit
fin si
N.B.p et c ne sont pas des enregistrements, mais des identifiants
pour le produit et la commande. Ainsi, le prix et la quantité de produit en
stock sont gardés dans des enregistrements différents.
(1 point) Lesquelles des transactions suivantes peuvent être
obtenues par l'execution du programme ci-dessus? Justifiez votre réponse.
T: r[x] r[y] a
T': r[x] a
T'': r[x] w[y] w[z] c
T''': r[x] r[y] w[y] w[z] c
Solution :
Les opérations sur la base de données dans Commander sont: lecture prix,
lecture stock, écriture stock et écriture total facturation dans la commande.
L'opération peut se terminer par Abort après la lecture du stock ou par
Commit à la fin.
Les seules transactions qui correspondent sont T et T'''. Dans T' et T'' il
manque une lecture.
(1 point) Dans le système s'exécutent en même temps trois
transactions: deux commandes d'un même produit et le changement du prix
de ce même produit. Montrez que l'histoire ci-dessous est une exécution
concurrente de ces trois transactions et expliquez la signification des
enregistrements qui y interviennent.
Solution :
Les transactions de cette exécution sont: T1 : r1[x] r1[y] w1[y] w1[z] c1 T2 : w2[x] c2 T3 : r3[x] r3[y] w3[y] w3[u] c3
T1 et T3 sont les deux commandes du même produit et T2 le changement
de prix. x est le prix du produit, y son stock, z et u les totaux
de facturation des deux commandes.
(1 point) Vérifiez si H est sérialisable en identifiant
les conflits et en construisant le graphe de sérialisation.
Solution :
Les conflits sur x: r1[x]-w2[x], w2[x]-r3[x]. Les conflits sur y: r1[y]-w3[y], w1[y]-r3[y], w1[y]-w3[y]. Sur z et sur u il n'y a pas de conflit.
Le graphe de sérialisation contient les arcs T1® T2,
T2® T3 et T1® T3. Il n'y a pas de cycle,
donc H est sérialisable.
(1 point) L'exécution H est-elle stricte? Justifiez
votre réponse.
Solution :
Après w1[y], on a r3[y] avant la fin de T1, donc H n'évite pas
les annulations en cascade, donc elle n'est pas stricte non plus.
(2 points) Quelle est l'exécution obtenue par verrouillage à
deux phases à partir de H? Quel prix sera appliqué pour la seconde
commande, le même que pour la première ou le prix modifié?
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 :
Le verrouillage à deux phases (1,5 points sur 2).
r1[x], r1[y] s'exécutent w2[x] est bloquée en attente de verrou sur x w1[y] s'exécute (r1[y] ne le bloque pas, c'est la même transaction) c2 est bloquée car T2 est bloquée (à cause de w2[x] bloquée) r3[x] s'exécute en partageant le verrou de lecture avec r1[x] r3[y] est bloquée en attente de verrou sur y, à cause de w1[y] w1[z] s'exécute c1 s'exécute et relâche les verrous de T1 ® w2[x] ne peut pas être débloquée, car r3[x] possède le verrou ® c2 aussi reste bloquée à cause de w2[x] ® r3[y] est débloquée, donc T3 est aussi débloquée w3[y], w3[u] s'exécutent c3 s'exécute et relâche les verrous de T3 ® w2[x] et c2 sont débloquées et s'exécutent.