Académique Documents
Professionnel Documents
Culture Documents
Cours
1. Introduction
“Bases de données” 1.1. Systèmes multi-utilisateurs
1.2. Pourquoi contrôler
Concurrence d’accès 2. Concepts des transactions
3. Techniques de contrôle de la concurrence
3° année (MISI)
3.1. Verrouillage à deux phases
Antoine Cornuéjols 3.2. Contrôle par tri des estampilles
www.lri.fr/~antoine 3.3. Autres problèmes
antoine.cornuejols@agroparistech.fr
Contrôle de concurrence
Contrôle de la concurrence d’accès Introduction
1.1. Systèmes multi-utilisateurs Souvent des centaines, voire des milliers d’utilisateurs
1.2. Pourquoi contrôler E.g. : système de réservation de sièges dans les compagnies aériennes ;
opérations bancaires ; ...
2. Concepts des transactions
Contraintes de temps réel
3. Techniques de contrôle de la concurrence
3.1. Verrouillage à deux phases Comment éviter les interactions négatives entre les
3.2. Contrôle par tri des estampilles différents utilisateurs
3.3. Autres problèmes et garantir la cohérence de la base de données ?
4
Contrôle de concurrence Contrôle de concurrence
Introduction Introduction
Transaction Exemples :
Programme formant une unité logique de traitement
T1 T2
Souvent délimitée par des instructions de début et de fin de transaction
____________________________ ____________________________
lire_element(X); lire_element(X);
Opérations élémentaires d’accès à la base de données :
X := X-N ; X := X + M ;
Lire_element(x)
ecrire_element(X); ecrire_element(X);
lit un élément nommé x et le stocke dans une variable de programme.
lire_element(Y);
(On suppose que la variable de programme se nomme aussi x).
Y := Y +N ; Accède à {X}
Ecrire_element(x) ecrire_element(Y);
écrit la valeur de la variable de programme x et le stocke dans l’élément de
données x. Accède à {X,Y}
5 6
T1 T2 T1 T2
lire_element(X); lire_element(X);
X := X-N; X := 80 - 5;
lire_element(X); lire_element(X);
X := X + M; X := 80 + 3;
ecrire_element(X); ecrire_element(75);
lire_element(Y); lire_element(Y);
L’élément X a une valeur L’élément X a une valeur
incorrecte car sa mise à incorrecte car sa mise à
ecrire_element(X); ecrire_element(83);
Y := Y + N; jour par T1 est “perdue” Y := 20 + 5; jour par T1 est “perdue”
ecrire_element(Y); ecrire_element(25);
(écrasée). (écrasée).
X = 83 et Y = 25 au lieu de X = 78 et Y = 25
7 8
Contrôle de concurrence Anomalies transactionnelles
Introduction : pourquoi contrôler ? Lecture impropre
L'utilisateur 1 ajoute 10 places et annule sa transaction, l'utilisateur 2 veut 7 places si elles sont disponibles...
Mises à jour temporaires (ou “lectures sales”)
T1 T2
lire_element(X);
X := X-N;
ecrire_element(X);
lire_element(X);
X := X + M;
ecrire_element(X);
La transaction T1 échoue lire_element(Y);
et doit rétablir l’ancienne
valeur de X ;
au même moment, T2 a lu
la valeur “temporaire”
9 10
T1 T3
somme := 0;
lire_element(A);
somme := somme + A;
.
.
.
lire_element(X);
X := X-N;
ecrire_element(X);
lire_element(X);
T3 lit X après que N ait été
somme := somme + X;
lire_element(Y); soustrait et lit Y avant que
somme := somme + Y; N ne soit ajouté.
lire_element(Y); Il en résulte un résumé
Y := Y + N; incorrect (différence de N).
ecrire_element(Y);
11 12
Anomalies transactionnelles Anomalies transactionnelles
Lecture fantôme Lecture fantôme
Notre utilisateur 2 désire n'importe quel vol pas cher pour emmener son équipe de foot (soit 11 personnes) à une
destination quelconque. Résultat : 11 places volatilisées du vol AF111 (histoire hélas véridique ...!)
13 14
Contrôle de concurrence
Introduction : Isolation des transactions Contrôle de la concurrence d’accès
Phénomènes indésirables :
1. Introduction
Lecture sale : Une transaction lit des données écrites par une transaction 1.1. Systèmes multi-utilisateurs
concurrente mais non validée
1.2. Pourquoi contrôler
Lecture non reproductible : Une transaction lit de nouveau des données
qu’il a lues précédemment et trouve que les données ont été modifiées par
2. Concepts des transactions
une autre transaction (qui a validé depuis la lecture initiale) 3. Techniques de contrôle de la concurrence
Lecture fantôme : Une transaction ré-exécute une requête renvoyant un 3.1. Verrouillage à deux phases
ensemble de lignes satisfaisant une condition de recherche et trouve que
3.2. Contrôle par tri des estampilles
l’ensemble des lignes satisfaisant la condition a changé à cause d’une
transaction récemment validée.
3.3. Autres problèmes
15
Contrôle de concurrence Contrôle de concurrence
Introduction : Importance de la reprise Introduction : Importance de la reprise
Types de pannes :
Le SGBD doit vérifier que :
17 18
Transaction
Unité atomique de travail Les opérations de transaction sont écrites dans un journal archivé sur
soit totalement terminée ; soit pas du tout. disque dur et sur sauvegarde.
FIN_TRANSACTION [valider, T] : indique que la transaction s’est terminée sans problème et que
ses opérations peuvent être validées (enregistrées de façon permanente
COMMIT signale que la transaction s’est bien terminée.
dans la base de données)
ROLL-BACK signale que la transaction ne s’est pas bien terminée. Toutes
les modifications effectuées doivent être annulées. [annuler, T] : indique que T a été annulée.
19 20
Contrôle de concurrence Contrôle de concurrence
Concept de transaction Concept de transaction
Atomicité. Une transaction est une unité atomique de traitement. Les accès simultanés aux mêmes objets d’une BD doivent être sérialisés pour que
ses utilisateurs puissent travailler indépendamment les uns des autres.
Cohérence. Une transaction préserve la cohérence si son exécution complète
fait passer la base de données d’un état cohérent à un autre. Un ensemble de transactions concurrentes est correctement synchronisé si leur
exécution séquentielle génère un état de la BD identique à celui qui serait obtenu si
Isolation. Les résultats d’une transaction doivent être invisibles pour les
elles étaient exécutées indépendamment (par un seul utilisateur).
autres transactions tant qu’elle n’est pas validée. Autrement dit, les exécutions
ne doivent pas interférer les unes avec les autres.
21 22
Équivalence d’exécutions
LOG (b)
Deux exécutions sont équivalentes si : T2
________________________
Ont les mêmes transactions et les mêmes opérations READ-WRITE
T2 : READ
Produisent les mêmes effets sur la base
T1 : READ WRITE-WRITE
Produisent les mêmes effets dans les transactions
T2 : WRITE
T1
T1 : READ
T1 = r1[x] x=x*5 w1[x] C1
T1 T2 non équivalent à T2 T1
T2 = r2[x] x=x+10 w2[x] C2 Graphe de précédence
pour la donnée b
23 24
Contrôle de concurrence Traitement et optimisation des requêtes
Sérialisabilité Exercices
Critère de sérialisabilité
Détecter les conflits et construire les graphes de sérialisation pour les
Un ensemble de transactions est sérialisable si le graphe de précédence exécutions suivantes. Indiquer les exécutions sérialisables et vérifier s'il y
a des exécutions équivalentes.
correspondant ne contient aucun cycle.
25
27 28
Contrôle de concurrence
Concept de transaction Contrôle de la concurrence d’accès
Exemple de transaction SQL
1. Introduction
EXEC SQL WHENEVER SQLERROR GOTO UNDO;
EXEC SQL SET TRANSACTION 1.1. Systèmes multi-utilisateurs
READ WRITE
DIAGNOSTIC SIZE 5
1.2. Pourquoi contrôler
ISOLATION LEVEL SERIALIZABLE; 2. Concepts des transactions
EXEC SQL INSERT INTO EMPLOYE (PRENOM, NOM, NOSS, NoSce, SALAIRE)
VALUES (‘Robert’, ‘Forgeron’, ‘1550222111999’, 2, 35000); 3. Techniques de contrôle de la concurrence
EXEC SQL UPDATE EMPLOYE
SET SALARY = SALARY * 1.1 WHERE NOSERVICE = 2;
3.1. Verrouillage à deux phases
EXEC SQL COMMIT; 3.2. Contrôle par tri des estampilles
GOTO LA_FIN;
UNDO: EXEC SQL ROLLBACK; 3.3. Autres problèmes
LA_FIN: ...;
29
Contrôle continu :
On utilise alors des méthodes de verrou
on vérifie au fur et à mesure de l'exécution des opérations que le critère
de sérialisabilité est bien respecté. Ces méthodes sont dites pessimistes :
Le principe est simple :
elles reposent sur l'idée que les conflits sont fréquents et qu'il faut les
traiter le plus tôt possible. on bloque l'accès à une donnée dès qu'elle est lue ou écrite par une
transaction (“pose de verrou”)
Contrôle par certification :
on libère cet accès quand la transaction se termine par commit ou rollback
cette fois, on se contente de vérifier la sérialisabilité quand la
(“libération du verrou”).
transaction s'achève. Il s'agit d'une approche dite optimiste : on
considère que les conflits sont rares et que l'on peut accepter de ré-
exécuter les quelques transactions qui posent problèmes.
31 32
Contrôle de concurrence Contrôle de concurrence
Méthodes de contrôle : méthode des verrous Méthodes de contrôle : méthode de verrouillage
SGBD
Granularité
T1 T2
x y z
Le verrouillage peut intervenir à différents niveaux de la base:
r1[x] ou w1[x] !1 Verrouillage de la base de données
!2 r2[z] ou w2[z]
r1[y] ou w1[y] !1 Verrouillage des tables concernées
… # r2[y] ou w2[y]
Verrouillage au niveau de la page
Verrouillage des lignes (mais une surcharge qui peut être supérieure
COMMIT1 " "
!2 au gain de performance)
33 34
Ces verrous sont posés de manière automatique par le SGBD en fonction des opérations
w1[y] !1
effectuées par les transactions ou les utilisateurs. Mais il est également possible de demander
explicitement le verrouillage de certaines ressources. ! : verrou exclusif
COMMIT1 " "
! : verrou partagé
" : non verrouillé
35 36
Contrôle de concurrence Contrôle de concurrence
Méthodes de contrôle : méthode de verrouillage Méthodes de contrôle : méthode de verrouillage
37 38
Un verrou peut toujours être posé sur une donnée non verrouillée, la donnée
est alors verrouillée
Plusieurs verrous en lecture peuvent être posés sur une donnée déjà
verrouillée en lecture
Si une donnée est verrouillée en écriture, aucun autre verrou ne peut être
posé tant que ce verrou n’a pas été supprimé.
Deux verrous sont dits compatibles si deux transactions qui accèdent à la même
donnée peuvent obtenir les verrous sur cette donnée au même moment.
39 40
Contrôle de concurrence Contrôle de concurrence
Le verrouillage à deux phases Le verrouillage à deux phases
Le plus répandu. wli[x] : verrou en écriture (write lock)
Le respect des deux protocoles précédents n'interdit pas des verrouillages et rli[x] : verrou en lecture (real lock)
déverrouillages au fur et à mesure de la progression des transactions.
Conflit
Cela laisse la porte ouverte à de nombreux cas d'interblocage de toutes les transactions -
Deux verrous pli[x] et qlj[y] sont en conflit si x = y et pl ou ql est un verrou en écriture.
appelés verrous mortels - ou de blocage éternel de quelques unes - appelés famines.
Stratégie de l’ordonnanceur
On démontre que si l'exécution de chaque transaction en deux phases seulement est
Règle 1 : L’ordonnanceur reçoit pi[x] et consulte le verrou déjà posé sur x, qlj[x], s'il existe.
imposée, une première pour tous les verrouillages _SREAD, XREAD ou XWRITE_une
si pli[x] est en conflit avec qlj[x], pi[x] est retardée et la transaction Ti est mise en attente.
seconde pour tous les déverrouillages _SRELEASE, XRELEASE_ sans qu'il soit
possible de verrouiller à nouveau, il existe alors au moins une exécution globale sinon, Ti obtient le verrou pli[x] et l'opération pi[x] est exécutée.
sérialisable. De plus certains cas de verrou mortel ou de famine sont aussi implicitement
Règle 2 : Un verrou pour pi[x] n'est jamais relâché avant la confirmation de l'exécution par
résolus.
un autre module, le gestionnaire de données.
Règle 3 : Dès que Ti relâche un verrou, elle ne peut plus en obtenir d'autre.
41 42
H1: r1[x] r2[y] w3[x] w1[y] w1[x] w2[y] c2 r3[y] r1[y] c1 w3[y] c3
Théorème :
Toute exécution obtenue par un verrouillage à deux phases est sérialisable.
Indiquez l'ordre d'exécution établi par l’Ordonnanceur, en considérant
qu'une opération bloquée en attente d'un verrou est exécutée en priorité
dès que le verrou devient disponible. On suppose que les verrous d'une
transaction sont relâchés au moment du COMMIT.
43
Contrôle de concurrence Contrôle de concurrence
Le verrouillage à deux phases Le verrouillage à deux phases
Verrou mortel
Interblocage SGBD
T1 T2
x y
Soient les deux transactions :
T1 : r1[x] -> w1[y] -> c1 w1[x] !1
WAIT-DIE : annuler les transactions qui demandent des ressources tenues par des SELECT ... FOR UPDATE fait de même mais pose un verrou intentionnel row share sur
transactions plus anciennes la table.
Si une telle exécution tente de poser un verrou sur un nuplet déjà verrouillé par une
WOUND-WAIT : annuler les transactions qui tiennent des ressources demandées par
autre transaction, elle est bloquée jusqu'à la terminaison de cette autre transaction.
des transactions plus anciennes
Lors du déblocage l'ensemble des nuplets sélectionnés est réévalué.
Détection :
Graphes d’attente : annuler les transactions (et libérer les verrous
correspondants) qui provoquent des cycles
Mécanismes de timeout
47 48
Contrôle de concurrence Contrôle de concurrence
Les verrous sous Oracle Les verrous sous Oracle
Verrous explicites : Mise d’un verrou
Il est parfois nécessaire de verrouiller explicitement les données avec la Commande LOCK TABLE
commande LOCK TABLE.
Options :
lock table <table> in { exclusive | share } mode [nowait] ;
Table
4 catégories importantes Type de verrou : share, share_update, exclusif
Verrous exclusifs : INSERT, UPDATE, DELETE Mode : nowait pour dire de mettre le verrou toute de suite ou d’attendre
Les autres transactions ne peuvent que lire la table (mise à jour et pose de verrous bloquées)
49 50
51 52
Contrôle de concurrence Contrôle de concurrence
Contrôle de concurrence : méthodes optimistes Contrôle de concurrence : méthodes par estampillage
Le mécanisme de gestion des concurrences par verrouillage à deux phases détecte a posteriori
des attentes entre transactions. Des mécanismes de prévention basés sur un ordonnancement a
priori des actions composantes des transactions peuvent être aussi envisagés.
53 54
La transaction rejetée est reprise par l'ordonnanceur après avoir reçu de lui une nouvelle estampille.
55 56
Résistance aux pannes
Plusieurs sources de pannes dans un SGBD
57