Contrôle de la concurrence Cours de Bases de Données Inge2-Info, IFIPS, Orasy 2006-07 Tao-Yuan JEN - tao-yuan.jen@u-cergy.fr
Problématique Exemple : virement bancaire Update compte set total=total -100 where compte.id = '0001' Update compte set total=total -100 where compte.id = '0001' Update compte set total=total +100 where compte.id = '0002' Update compte set total=total +100 where compte.id = '0002' Perdu !
Problématique Exemple : virement bancaire Unité entière Update compte set total=total -100 where compte.id = '0001' Update compte set total=total +100 where compte.id = '0002' Unité entière Unité entière Un un Unité
ACID A : Atomicité tous exécuté ou non exécuté C : Cohérence transformation séquentielle d’un état cohérent à un autre I : Isolation pas d’influence d’autres D : Durabilité si valider, alors persister
Transactions Actions: Lecture (read) : RT(O) Ecriture (write) : WT(O) Validations ( commit) : CommitT Annulation (abort) : AbortT Exécution concurrente : partage de ressources sérialisation
Sérialisation L'effet d'une exécution concurrente d'un ensemble de transactions est égale à une exécution séquentielle de cet ensemble de transaction sous un certain ordre Exemple T1 : R(A) W(A) W(C) commit T2 : R(B) W(B) commit
Anomalies et conflits Deux action sont conflictuelles si au moins une est l'écriture. Anomalies connues et leur conflit : Lecture non validée conflit WR Lecture non reproductibles conflit RW Perte d'opération conflit WW
Lecture non validée (1) T1 : R(A) W(A) abort T2 : R(A) W(A) ...... La transaction T2 a lu une valeur de A qui n'est jamais existé
Lecture non validée (2) T1 : R(A) W(A) R(B) W(B) commit L'exécution rend la base de données incohérente Exemple : T1 : A -> B 1000 euros T2 : A= A*(1+2%), B= B*(1+2%)
Lecture non reproductible T1 : R(A) R(A) .... T2 : R(A) W(A) commit La transaction T1 peut se trouver lire deux valeurs distinctes de A sans avoir modifié A (pas de I dans ACID)
Perte d'opération T1 : R(A) W(A) commit T2 : R(A) W(A) commit La transaction T1 supprimer l'effet de T2. Exemple : A= 5; T1 : A = A+1; T2 : A = A -1;
Annulation impossible T1 : R(A) W(A) abort T2 : R(A) W(A) commit Sérialisation garantit les transformations entre des états cohérents si les transactions sont validées. Sinon, il faut éliminer tous effets produits par la transaction annulée. Exemple : A= 5; T1 : A = A+1; T2 : A = A+1;
Sérialisable conflituellement S est sérialisable conflictuellement si les actions conflictuelles des S sont exécutées dans le même ordre que les actions conflictuelles dans une exécution en série. T1 : R(A) commit T2 : W(A) commit T3 : W(A) commit (a) Sérialisable conflictuellement T1 : R(A) W(A) commit T2 : W(A) commit T3 : W(A) commit (b) Sérialisable mais pas sérialisable conflictuellement
Graphe des conflits (1) - un noeud pour chaque transaction - un arc de Ti à Tj s'il existe une action a de Ti qui précède une action b de Tj telles que a et b sont conflictuelles. Une exécution concurrente S est sérialisable conflictuellement ssi le graphe de conflits de S est acyclique
Graphe des conflits (2) T1 : R(A) commit T2 : W(A) commit (a) Sérialisable conflictuellement T3 T1 : R(A) W(A) commit T2 : W(A) commit T3 : W(A) commit T1 T2 (b) Sérialisable mais pas sérialisable conflictuellement T3
Verrouillages Verrou partageable (en lecture) : LR(A) - Un verrou en lecture sur A doit être obtenu par T avant une lecture de A par T Verrou exclusif (en écriture) : LW(A) - Un verrou en écriture sur A doit être obtenu par T avant une écriture de A par T
Verrouillage en 2 phases - LW(O) précède W(O) LR(O) ou LW(O) précèdent R(O) - Tous les verrou doivent être libérés avant la fin de la transaction ou dans son annulation. - 2PL : Aucune demande de verrouillage ne pet succéder à une libération de verrou. è
Sérialisation et 2PL 2PL garantit le graphe des conflits est acyclique Protocole : une action n’est exécutée que si elle n’est pas conflictuelle avec une action déjà exécutée d’autre transaction active Entrée : W(B) W(C) commit W(A) commit W(D) W(B) commit Sortie : W(B) W(C) commit W(A) commit W(D) W(B) commit
Lecture non validée et 2PL Entrée : T1 : R(A) W(A) R(B) W(B) commit T2 : R(A) W(A) R(B) W(B) commit T1 T2 Sortie : T1 : R(A) W(A) R(B) W(B) commit T2 : R(A) W(A) R(B) W(B) commit T1 T2
Lecture non reprodctible et 2PL Entrée : T1 : R(A) R(A) commit T1 T2 T2 : R(A) W(A) commit Sortie : T1 : R(A) R(A) commit T1 T2 T2 : R(A) W(A) commit
Verrouillage en 2 phases strict - LW(O) précède W(O) LR(O) ou LW(O) précèdent R(O) - Tous les verrou doivent être libérés avant la fin de la transaction ou dans son annulation. - Strict 2PL : Tous les verrous d’une transaction sont libérés uniquement à la fin de la transaction
Annulation possible avec Strict 2PL Strict 2PL garantit la possibilité d’annulation Entrée : T1 : R(A) W(A) abort T2 : R(A) W(A) commit Sortie : T1 : R(A) W(A) abort T2 : R(A) W(A) commit
2PL et interblocage Entrée : Sortie : T1 : W(A) W(B) W(C) commit T2 : W(B) W(A) commit Sortie : T1 : LW(A) W(A) LW(B) T2 : LW(B) W(B) LW(A) ….
Gestion des interblocages (1) Détection : Graphe des attentes Prévention : Ti demande un verrou conflictuel avec Tj Wait-Die : Si Ti plus de priorité, alors Ti attend sinon annule Ti Wound-wait : Si Ti plus de priorité, alors annule Tj sinon Ti attend
Gestion des interblocages (2) Graphe des attentes : Si interblocages, alors cyclique T1 : LR(A), R(A), LR(B) T2 : LW(B), W(B) LW(C) T3 : LR(C), R(C) LW(A) T4 : LW(B) T1 T2 T4 T3
Gestion des interblocages (3) Détection V.S. Prévention Fréquence de détection Choix des transaction bloquantes à annuler
Problème des fantômes Ajouter ou supprimer une objet Donc, blocage un ensemble d’objets T1 : LireMax(A) SupprimerMax(B) T2 : LireMax(B) AjouterMax(A)
Niveaux d'isolations Lecture non validée Lecture validée Lecture reproductible Sérialisation Par défaut : sérialisation et lecture-écriture
Lecture non validée
Lecture validée
Lecture reproductible
Sérialisable
Performance et niveaux d'isolation