Précédent Index

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 :

  1. 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

  2. (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.

  3. Appliquer un verrouillage à deux phases à l'histoire obtenue dans la question précédente. Que se passe-t-il ? (1 point)

    Solution:

    DEADLOCK !

  4. 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] ...
    1. Complétez (attention au choix commit ou rollback).
    2. Y-a-t-il une anomalie dans le solde de C à la fin ?
    3. L'histoire obtenue est-elle sérialisable ?
    4. Appliquez un verrouillage à deux phases au début de l'histoire donnée ci-dessus et donnez le résultat.
    Solution:

    1. On complète avec rollback puisque le test montre qu'il reste moins de 4000 FF.
    2. Pas d'anomalie puisqu'on a annulé !
    3. Sérialisable mais pas recouvrable. Risque : on annule T1, et T2 a fait une lecture sale.
    4. Le 2PL décale de r2[C] après C1.

Précédent Index