3 Concurrence et reprise sur pannes (6 points)
On suppose qu'un programme de reservation de voyage travaille sur les
tables suivantes
Client (idClient, Solde)
Inscription (idClient, voyage)
Voyage (voyage, tarif)
Quand un client demande à s'inscrire a un voyage, le programme traite
la demande comme suit:
Inscription (Voyage V, Client C)
DEBUT
1 Lire V et stocker solde dans la variable v_tarif
2 Inserer la ligne (C, V) dans la table Inscription
3 Lire C et stocker le tarif dans la variable v_solde
4 Si (v_solde > v_tarif) alors
5 Diminuer le solde du client avec:
UPDATE CLIENT SET solde = solde - v_tarif
WHERE idClient = C;
et commit
6 Sinon rollback
FIN
On suppose que le solde du client C est à 5000 et qu'on lance 2
transactions, T1 et T2, pour réserver respectivement un voyage V1
à 3000 FF et un voyage V2 à 4000 FF.
Questions :
- Donner une imbrication des opérations de T1 et
T2 qui aboutisse à un solde négatif de C. (1 point)
Solution:
r1[V1]r2[V2]w1[I1]w2[I2]r1[C]r2[C]w1[C] C1 w2[C] C2
- (OPTION) Que devient le problème si on remplace la clause
UPDATE dans le programme par :
UPDATE CLIENT SET solde = v_solde - v_tarif
WHERE idClient = C;
Solution:
Le client paye un voyage, pour deux inscriptions.
- Appliquer un verrouillage à deux phases à
l'histoire obtenue dans la question précédente. Que se
passe-t-il ? (1 point)
Solution:
DEADLOCK !
- Soit le début d'histoire suivante (I1 et I2 sont les
inscriptions) (4 points) :
r1[V1]r2[V2]w1[I1]w2[I2]r1[C]w1[C] r2[C] ...
- Complétez (attention au choix commit ou rollback).
- Y-a-t-il une anomalie dans le solde de C à la fin ?
- L'histoire obtenue est-elle sérialisable ?
- Appliquez un verrouillage à deux phases au début de l'histoire
donnée ci-dessus et donnez le résultat.
Solution:
- On complète avec rollback puisque le test montre qu'il
reste moins de 4000 FF.
- Pas d'anomalie puisqu'on a annulé !
- Sérialisable mais pas recouvrable. Risque : on annule
T1, et T2 a fait une lecture sale.
- Le 2PL décale de r2[C] après C1.