Introduction aux SGBD et leurs fonctionnalités
Introduction aux SGBD et leurs fonctionnalités
INTRODUCTION
1.1. Définitions
- une base de données est une collection de données inter-reliées. C'est une entité cohérente
logiquement et véhiculant une certaine sémantique,
- un SGBD sépare la partie description des données, des données elles mêmes. Cette
description est stockée dans un dictionnaire de données (également géré dans le SGBD) et
peut être consultée par les utilisateurs,
- une extension d'une base de données correspond aux données de la base à un instant donné.
Par définition cet état est dynamique.
1.2. Fonctionnalités
Nous donnons ici les caractéristiques souhaitables des SGBD qui ne sont pas forcément prises
en compte par les SGBD commerciaux.
Une base de données doit permettre d'accéder la même information par plusieurs utilisateurs
en même temps. Le SGBD doit inclure un mécanisme de contrôle de la concurrence basé sur
des techniques de verrouillage des données (pour éviter par exemple qu'on puisse lire une
information qu'on est en train de mettre à jour).
Le partage des données se fait également par la notion de vue utilisateur, qui permet de
définir pour chaque classe d'utilisateurs la portion de la base de données qui l'intéresse (et
dans la forme qui l'intéresse).
Un SGBD doit offrir plusieurs interfaces d'accès, correspondant aux différents types
d'utilisateurs pouvant s'adresser à lui. On trouve des interfaces orientées utilisateur final
(langages de requêtes déclaratifs comme SQL avec mise en oeuvre graphique, interface de
type formulaire, ...) ou bien orientées programmeurs d'applications (interface avec des
langages de programmation classiques comme par exemple l'approche SQL immergé ou
"embedded SQL").
Un SGBD doit permettre de représenter des données inter-reliées de manière complexe. Cette
facilité s'exprime à travers le modèle de données sous-jacent au SGBD. Chaque modèle de
données offre ses propres concepts pour représenter les relations. On peut citer les modèles
hiérarchique, réseau (première génération de modèles), relationnel (génération actuelle),
sémantiques (ou orientés vers la conception tel que Entité-Association, Z, ...) ou orienté-objet
(la génération future ?).
Un schéma de base de données se compose d'une description des données et de leurs relations
ainsi que d'un ensemble de contraintes d'intégrité. Une contrainte d'intégrité est une propriété
de l'application à modéliser qui renforce la connaissance que l'on en a. On peut classifier les
contraintes d'intégrité, en contraintes structurelles (un employé a un chef et un seul par
exemple) et contraintes dynamiques (un salaire ne peut diminuer). Les SGBD commerciaux
supportent automatiquement un certain nombre de contraintes structurelles, mais ne prennent
pas en compte les contraintes dynamiques (elles doivent être codées dans les programmes
d'application).
Une base de données est souvent vitale dans le fonctionnement d'une organisation, et il n'est
pas tolérable qu'une panne puisse remettre en cause son fonctionnement de manière durable.
Les SGBD fournissent des mécanismes pour assurer cette sécurité. Le premier mécanisme est
celui de transaction qui permet d'assurer un comportement atomique à une séquence d'actions
(elle s'effectue complètement avec succès ou elle est annulée). Une transaction est une
séquence d'opérations qui fait passer la base de données d'un état cohérent à un nouvel état
cohérent. L'exemple typique est celui du débit-crédit pour la gestion d'une carte bancaire. Ce
mécanisme permet de s'affranchir des petites pannes (style coupure de courant).
En ce qui concerne les risques liés aux pannes disques, les SGBD s'appuie sur un mécanisme
de journalisation qui permet de regénérer une base de données automatiquement à partir d'une
version de sauvegarde et du journal des mouvements.
- niveau interne ou physique : décrit le modèle de stockage des données et les fonctions
d'accès
- niveau externe : correspond aux différentes vues des utilisateurs. Chaque schéma externe
donne une vue sur le schéma conceptuel à une classe d'utilisateurs.
Le SGBD doit être capable de faire des transformations entre chaque niveau, de manière à
transformer une requête exprimée en terme du niveau externe en requête du niveau conceptuel
puis du niveau physique.
La plupart des SGBD ne séparent pas complètement ces trois niveaux, mais respectent
néanmoins ces principes de séparation.
- indépendance logique : on peut changer le niveau conceptuel sans remettre en cause les
schémas externes ou les programmes d'application. L'ajout ou le retrait de nouveaux concepts
ne doit pas modifier des éléments qui n'y font pas explicitement référence,
- un schéma de relation R, dénoté par R(A1, A2, ..., An), est un ensemble d'attributs R = {A1,
A2, ..., An}. A chaque attribut Ai est associé un domaine Di, Ai indiquant le rôle joué par le
domaine Di dans la relation R. Un schéma de relation décrit une relation et représente
l'intension de celle-ci. Le degré de la relation est le nombre d'attributs de celle-ci.
Exemple :
On peut également définir une relation à partir du produit cartésien des domaines de son
schéma R :
Il est important de noter qu'un schéma de relation est quasi invariant dans le temps, alors que
l'extension représente les données présentes à un instant donné dans la base.
- une valeur d'attribut est atomique mais peut être éventuellement nulle (valeur particulière
qui indique que la valeur est manquante).
Par définition, tous les nuplets d'une relation sont distincts deux à deux (puisqu'il s'agit d'un
ensemble). Il est également intéressant de définir des sous-ensembles du schéma qui
permettent d'identifier de manière unique un nuplet (par exemple dans l'exemple de l'étudiant,
l'attribut No-ss permet d'identifier un étudiant). Ces sous-ensembles du schéma s'appellent des
clés. Le système doit donc garantir l'unicité des valeurs de clé (un seul nuplet étudiant peut
avoir une valeur de No-ss donnée).
Il peut y avoir plusieurs clés pour une même relation (elles sont alors appelées clés
candidates) et on choisit le plus souvent une clé particulière dite clé primaire qui servira
d'identification privilégiée des nuplets. Cette clé sera indiquée de manière graphique en
mettant en gras les attributs la composant.
Par exemple :
- contrainte d'intégrité sur les entités : une clé primaire ne peut contenir de valeur nulle.
C'est une contrainte exprimée entre deux relations. Intuitivement cela consiste à vérifier que
l'information utilisée dans un nuplet pour désigner un autre nuplet est valide, notament si le
nuplet désigné existe bien. Par exemple, si on considère une relation EMPLOYE(no-ss, nom,
adresse, rôle, no-dept) et une relation DEPARTEMENT(no-dept, nom, no-ss-chef), un nuplet
de EMPLOYE référence un nuplet de DEPARTEMENT via l'attribut no-dept (numéro de
département) et un nuplet de DEPARTEMENT référence un nuplet de EMPLOYE via
l'attribut no-ss-chef (numéro sécurité sociale du chef de département). Il est important de
s'assurer que les nuplets référencés existent bien. On peut noter qu'un nuplet peut référencer
un autre nuplet de la même relation. Dans ce cas, no-dept et no-ss-chef sont appelés des clés
étrangères, puisque se sont des attributs clés d'une autre relation.
Cette contrainte implique un ordre dans la création ou la destruction des entités, puiqu'on ne
peut créer un département si le nuplet correspondant au chef n'a pas été créé et on ne peut
détruire un chef de département si le département existe toujours (ou bien si on n'a pas mis un
autre chef).
De nombreux opérateurs relationnels ont été proposés, on peut cependant présenter ici les
plus courants. On peut classifier les opérateurs relationnels en trois catégories :
- les opérateurs binaires travaillant sur des relations de même schéma : union, intersection,
différence
- les opérateurs binaires travaillant sur des relations de schémas différents : jointure, produit
cartésien, théta-jointure, division
La présentation des opérateurs est illustrée par un exemple de gestion d'une base
d'invitations. Cette base de données décrit les personnes invitées et les plats qui ont été servis.
Elle est composée de trois relations :
REPAS(date,invité) donne la liste des invités qui ont été reçus et à quelle date
N.B : les attributs "personne" et "invité" ont même domaine et les clés sont en gras.
a) Opérateurs unaires :
Exemple : Q1
la sélection prend en entrée une relation R définie sur un schéma SR et produit en sortie une
nouvelle relation de même schéma SR ayant comme nuplets ceux de R satisfaisant à
l'expression de sélection. Une expresion de sélection est une condition booléenne construite à
partir des connecteurs logiques et, ou, non et de conditions simples (attribut de R - opérateur
de comparaison - constante ou attribut de R - opérateur de comparaison - attribut de R)
Exemples : Q1, Q2
- projection : PROJECTION A1, ..., An (R)
la projection prend en entrée une relation R définie sur un schéma SR et produit en sortie une
nouvelle relation de schéma A1, ..., An (schéma inclus dans SR) ayant comme nuplets ceux
de R restreints au sous-schéma A1, ..., An. Il faut noter que la cardinalité de la nouvelle
relation est inférieure ou égale à celle de R, puisque des doublons ont pu être produits par la
projection et sont donc supprimés (une relation est toujours un ensemble).
Les trois opérateurs ensemblistes opèrent sur des relations R et S de même schéma SRS.
- union : R UNION S
produit une nouvelle relation de schéma SRS ayant les nuplets de R et ceux de S (les
doublons sont supprimés).
- intersection : R INTERSECTION S
produit une nouvelle relation de schéma SRS ayant les nuplets présents dans R et dans S.
- différence : R - S
produit une nouvelle relation de schéma SRS ayant les nuplets de R qui ne sont pas dans S.
Attention, la différence n'est pas commutative.
Exemple : Q5
- jointure : R * S
Il faut que les schémas SR et SS aient une intersection SRS non vide. La relation produite a
un schéma qui est l'union des schémas SR et SS et dont les nuplets sont la concaténation des
nuplets de R avec ceux de S s'ils ont même valeur pour tous les attributs communs (c'est à dire
ceux de SRS). On parle également de jointure naturelle ou équi-jointure.
Exemple : Q2
- produit cartésien : R X S
Il faut que les deux schémas SR et SS soient disjoints. La relation produite a un schéma qui
est l'union des schémas SR et SS et dont les nuplets sont la concaténation des nuplets de R
avec ceux de S. Attention le nombre d'éléments du produit cartésien est le produit des
cardinalités des relations R et S!
Exemple : Q4
- théta-jointure : R * (condition) S
Cette opération non canonique est équivalente à un produit cartésien suivi d'une opération de
sélection.
Exemple : Q3
- division : R / S
R est définie sur un schéma SR composé des ensembles d'attributs X,Y (SR = X UNION Y)
et S est définie sur un schéma SS composé de l'ensemble d'attributs Y (SS = Y). La relation
produite est définie sur le schéma Sres (Sres = SR - SS = Y) et comprend tous les nuplets dont
la concaténation avec tous les nuplets de S appartient à R (résultat X S inclus-ou-egal R).
R / S = R1 - R2 avec
Exemple : Q6
Un des grands intérets de l'algebre relationnelle est l'ensemble de propriétés des opérateurs ce
qui permet l'optimisation des requetes.
from R
where condition
projection PROJECTION A1, ..., An (R) --> select distinct A1, ..., An
from R
Q1 - Q2 select * from Q2
from T, U
cartésien from R, S
from R, S
where condition
division T / P --> select V
group by V
Les faits élémentaires (données) et les propriétés générales (schéma ainsi que les règles
d'intégrité et d'inférences) sont représentés par des axiomes d'une théorie du premier ordre.
Répondre à une question revient donc à démontrer un théorême dans cette théorie.
Avantages : une question est résolue en dehors de toute interprétation et on peut utiliser des
règles d'intégrité ou d'inférences (qui permettent de déduire des informations non stockées).
Les propriétés générales (schéma seulement) sont considérées comme les axiomes d'une
théorie du premier ordre, alors que les faits élémentaires (données) sont perçus comme une
interprétation de cette théorie. Si cette interprétation vérifie tous les axiomes, elle constitue un
modèle. Répondre à une question revient à chercher la valeur de vérité d'une formule
relativement à l'interprétation. On distingue alors entre question fermée (sans variable libre)
pour laquelle la réponse est vrai ou faux, et question ouverte (avec variable libre) pour
laquelle la réponse sont les valeurs de l'interprétation pour lesquelles la question est vraie.
Avantages : on retrouve la théorie relationnelle classique
Nous présentons dans la suite cette deuxième approche, les BD déductives étant étudiées dans
le cadre du cours de 3ème année. On rencontre deux classes de langages prédicatifs, ceux à
variable nuplet (le domaine d'interprétation d'une variable est le nuplet) et ceux à variable
domaine (le domaine d'interprétation d'une variable est le domaine).
{t1[A1], t2[A2], ..., tn[An] / COND(t1, t2, ..., tn, tn+1, tn+2, ..., tn+m)}
avec ti (de 1 à n+m) variables nuplets non nécessairement distinctes deux à deux, Ai sont des
attributs de relations associées aux ti et COND est une formule du calcul relationnel à variable
nuplet. L'expression de la forme ti[Aj] exprime la valeur du nuplet ti suivant l'attribut de nom
Aj (terme de projection).
Une formule est construite à partir de prédicats atomiques (atomes) qui sont d'une des formes
suivantes :
1) Un atome de la forme R(ti) où R est un nom de relation et ti est une A variable nuplet. Cet
atome identifie le domaine de la variable ti comme celui de la relation de nom R.
Une formule est constituée d'atomes connectés par les opérateurs logiques ET, OU, NON et se
définit de la manière suivante :
B 2- Si F1 et F2 sont des formules, alors (F1 et F2), (F1 ou F2), non(F1) sont des formules,
3- Si F est une formule, alors (ILEXISTE t) (F) est une formule avec t variable nuplet,
4- Si F est une formule, alors (QQSOIT t) (F) est une formule avec t variable nuplet.
NB : une variable est dite libre si elle n'est pas quantifiée dans sa portée, liée sinon.
{x1, x2, ..., xn / COND(x1, x2, ..., xn, xn+1, xn+2, ..., xn+m)}
avec xi variables domaines (non nécessairement distinctes) d'attributs et COND est une
formule du calcul relationnel à variable domaine.
Une formule est construite à partir d'atomes. Un atome peut être d'une des formes suivantes :
1) Un atome de la forme R(x1, x2, ..., xj) où R est le nom d'une relation de degré j et chaque
xi est une variable. <x1, ..., xj> représente un nuplet de la relation R et xi la ième valeur dans
le nuplet.
Une formule est construite à partir des mêmes règles que celles définies pour le calcul
relationnel à variable nuplet.
4. Dépendances fonctionnelles et
normalisation
Problème : un mauvais schéma relationnel peut entrainer des anomalies lors des
manipulations.
APPROVISIONNEMENT
Solutions :
4.4. Définitions :
R(X,Y,Z) schéma de relation
A un attribut quelconque
- dépendance fonctionnelle élémentaire (DFE) :
- clé :
Les formes normales définissent un ordre partiel sur les schémas de relation. On peut donc
voir une forme normale comme une classe d'équivalence (on peut comparer deux schémas
dans deux classes d'équivalence différentes mais pas dans la même). Il faut aussi noter que le
seul élément qui est pris en compte par les formes normales est la non redondance
d'informations d'un schéma. Selon les formes normales un "bon" schéma est un schéma sans
redondance (ce qui ne veut pas forcément dire qu'il est efficace par exemple). Un schéma
relationnel sans qualité particulière est appelé schéma en 1ère forme normale (on note 1FN) et
si on rajoute certaines qualités on obtient les deuxième et troisième formes normales (on note
2FN et 3FN).
On ne présente ici que les formes normales dont la définition utilise exclusivement les
dépendances fonctionnelles. Si on prend en compte d'autres dépendances entre données
comme les dépendances multivaluées on obtient alors les 4FN et 5FN. La 3FN reste
cependant l'objectif de normalisation le plus "classique".
1FN : une relation est en première forme normale ssi tout attribut a une valeur atomique (vrai
par définition du modèle relationnel)
2FN : une relation est en deuxième forme normale ssi elle est en 1FN et si tous les attributs
non clés sont pleinement dépendants des clés (toutes les dépendance entre une clé et un
attribut non clé sont élémentaires)
3FN : une relation est en troisième forme normale ssi elle est en 2FN et si tous les attributs
non clés sont directement et pleinement dépendants des clés (si tout attribut non clé ne dépend
pas d'un autre attribut non clé)
3FNBCK (Boyce-Codd-Kent) : une relation est en 3FNBCK ssi elle est en 3FN et si les
seules DFE sont celles de la forme C -> X avec C clé (seules les clés sont en partie gauche de
DF).
Algorithme de décomposition :
sortie : une ou plusieurs relations en 3FN dont la jointure redonne la relation initiale (par
contre des DF de E ont pu être perdues)
principe : l'algorithme peut se voir comme la construction d'un arbre binaire. La racine de cet
arbre est la relation à décomposer. L'arbre se construit récursivement de la manière suivante :
- le fils gauche du noeud racine est une relation composé de tous les attributs de dfi
- le fils droit du noeud racine est une relation composée de tous les attibuts de la racine
excepté ceux présents en partie droite de dfi
On sait néanmoins que toute relation admet une décomposition en 3FN qui préserve les DF.
Il existe un algorithme dit de synthèse qui permet d'obtenir une décomposition 3FN qui
préserve les DF. Il est basé sur le calcul de la couverture minimale (ou irredondante) d'un
ensemble de DF.
H, N -> T
P, H -> N
H,N -> Y
H, Y -> P
P, H -> T
H, Y -> T
H, N -> P, T, Y
P, H -> T, Y, N
H, Y -> N, P, T
- par définition le schéma est en 1ère forme normale. Est il en 2ème forme normale ?
ou bien :
5. Architecture logicielle d'un SGBD
On peut décrire l'architecture logicielle d'un SGBD de la manière suivante :
- le moniteur d'exécution a pour rôle de gérer l'interface d'accès du SGBD, les connections à
la base, de retourner à l'extérieur les messages d'erreurs ou les résultats obtenus ainsi que
d'enchainer les différentes opérations.
- l'analyseur a pour but d'effectuer les vérifications syntaxiques et sémantiques sur les
commandes qu'on lui passe ainsi que de produire une représentation interne de ces
commandes. Il s'agit la plupart du temps d'un arbre algébrique dont les noeuds feuilles
représentent les relations sur lesquelles porte la commande et les noeuds non feuilles
représentent les opérateurs algébriques qui s'appliquent sur ces relations) :
- le contrôleur vérifie que les commandes sont licites, c'est à dire que l'utilisateur a les droits
requis pour les commandes effectuées, que les contraintes d'intégrité ne sont pas violées.
- le système d'exécution doit exécuter les plans d'exécution qui lui sont fournis. Cette
exécution peut être interprétée (dans la plupart des cas) ou compilée (rarement). L'avantage de
la compilation est qu'elle permet de ne pas effectuer les phases d'analyse, de contrôle et
d'optimisation à chaque fois. Une commande compilée est cataloguée et peut être ensuite
évaluée directement. Peu de SGBD commerciaux permettent une exécution compilée.
L'exécution d'une commande s'appuie sur la machine algébrique qui permet d'exécuter un
ensemble d'opérateurs canoniques (sélection, projection, jointure, ...). Le gestionnaire des
méthodes d'accès permet d'accéder efficacement aux données sur le disque et le gestionnaire
des accès concurrents permet de contrôler l'accès multi-utilisateurs.
- le catalogue joue un rôle central dans le SGBD puisque c'est la structure de données qui
centralise toute l'information nécessaire aux différents modules. Il contient notamment la
description des relations, vues et contraintes d'intégrité, la description des utilisateurs avec
leurs droits d'accès ainsi que la description des structures de stockage utilisées (placement des
données sur le disque, index définis, ...). La plupart du temps, le catalogue est défini comme
un ensemble de relations qui sont accessibles par les utilisateurs (s'ils en ont le droit) come
toute relation.
L'optimisation peut se faire en deux passes, une première s'appuyant sur les propriétés
algébriques des opérateurs qui permet surtout de limiter la taille des relations manipulées et
une seconde basée sur des fonctions de coût qui permet d'affiner l'optimisation en tenant
compte des caractéristiques des relations et attributs manipulés (taille des relations,
discriminance des attributs, connaissance des clés, existence de chemins d'accès efficaces, ...).
L'idée de base est de réduire au maximum la taille des relations intermédiaires produites.
Pour cela, il faut utiliser le plus possible les sélections et les projections et les faire le plus tôt
possible. Il faut donc faire "descendre" les sélections et projections dans l'arbre et rajouter
éventuellement des projections permettant de ne manipuler que les attributs effectivement
utilisés dans l'expression.
SELECTION C1 and c2 ... and Cn(R) = SELECTION C1( SELECTION C2(...( SELECTION
Cn(R))))
2- Commutativité de la sélection :
3- Séquence de projections :
PROJECTION A1, A2, ..., An( SELECTION C(R)) = SELECTION C( PROJECTION A1,
A2, ..., An(R))
5- Commutativité de la jointure :
R*S=S*R
O = { UNION , INTERSECTION , *, X}
(R O S) O T = R O (S O T)
O = { UNION , INTERSECTION , -}
O = { UNION , INTERSECTION , -}
2-2 Descendre les opérations de sélection le plus bas possible dans l'arbre (règles 2, 4, 6 et 10)
2-3 Réarranger les feuilles de l'arbre pour évaluer les sélections les plus restrictives d'abord
(règle 9)
2-4 Combiner les produits cartésiens avec des expressions de sélection appropriées pour en
faire des jointures
2-5 Faire des projections le plus tôt possible dans l'arbre (le cas échéant en en créant des
nouvelles,
non explicites dans la requête) pour manipuler seulement l'information intéressante (règles 3,
4, 7 et 11)
2-6 Identifier les sous arbres qui peuvent être exécutés par un seul algorithme (les sélection -
projection - jointure par exemple)
- le coût de calcul
- le coût de communication (si les données ne sont pas toutes sur le même site)
Cette dernière information permet d'évaluer la sélectivité d'un attribut (nt / nd).
Une transaction est une séquence d'opérations qui accèdent et modifient le contenu d'une base
de données et qui est complètement exécutée ou pas du tout (unité atomique de traitement).
Une transaction s'effectue soit complètement et alors les mises à jour qu'elle a effectuées sur
la base de données sont validées, soit elle s'effectue incomplètement (annulation ou panne) et
alors toutes les mises à jour effectuées depuis le début de la transaction sont invalidées.
- Cohérence : une transaction prend une base de données dans un état cohérent et la
transforme dans une nouvelle base de données qui est dans un état cohérent (préservation de
la cohérence)
- Isolation : les mises à jour faites par une transaction ne sont visibles à l'extérieur de celle-ci
(pour les autres transactions) qu'après la validation de la transaction.
- Durabilité : après la fin d'une transaction, les mises à jour sont définitives même en cas de
futurs problèmes matériels (grace au mécanisme de reprise)
- perte d'opérations :
T1 T2
lire(X)
X := X-N
lire(X)
X := X+M
écrire(X)
lire(Y)
Y := Y+N
écrire(Y)
- lectures impropres :
T1 T2
lire(X)
X := X-N
écrire(X)
lire(X)
X := X+M
lire(Y)
annulation T1
La valeur de X lue par T2 est incohérente car X a été lu après la mise à jour faite par T1 qui a
été ensuite invalidée par l'annulation de T1.
Il faut fixer une propriété déterminant une exécution correcte de transactions concurrentes.
Cette propriété est la sérialisibilité à savoir une exécution concurrente de transactions est
correcte si elle est équivalente (produit le même résultat) à une exécution en série. Il faut noter
que cette définition n'est pas constructive, elle ne donne pas de moyens de garantir la
propriété.
La sérialisation est une propriété forte qui limite le parallélisme à l'exécution donc les
performances. Certains SGBD comme Oracle propose des assouplissements de cette propriété
basés sur des protocoles multi-versions.
- problème système,
Cet échec de la transaction peut entrainer une incohérence si une partie seulement des mises à
jour ont été effectuées (ne respecte pas la propriété d'atomicité). Par conséquent, il faut
restituer l'état antérieur de la base grace à un mécanisme de reprise.
Les pannes matérielles ou logicielles graves ne peuvent se traiter par un simple mécanisme
transactionnel. Le principe général est de garder un historique persistant de tout ce qui se
passe sur la base de données. A partir de cet historique (appelé journal) et d'états antérieurs
(sauvegardes) de la base de données, on peut reconstituer la base de données dans l'état
cohérent qui précède la panne. Ce mécanisme est appelé "reprise à froid".
Le journal est donc un support sur disque qui maintient les informations nécessaires pour la
reprise :
- point de reprise P.
Un point de reprise consiste à écrire sur disque les mises à jour des transactions validées
(copie du buffer sur le disque). Ce mécanisme s'effectue périodiquement, toutes les N
secondes, toutes les N transactions, ... Le journal est également sauvegardé sur disque à ce
moment là.
- approche pessimiste ou a priori (on fait en sorte que l'on ne puisse pas avoir d'exécution non
correcte) : on trouve ici les techniques de verrouillage ou d'estampillage,
- approche optimiste ou a postériori (on laisse s'exécuter les transactions sans contraintes et
on moment de la validation on vérifie qu'il n'y a pas de conflits avec les autres transactions).
Un verrou est une variable d'état associée à un objet X de la base et indiquant son état vis à vis
des opérations de lecture / écriture.
Un verrou peut être binaire (deux états verrouillé ou libre avec deux opérations verrouiller(X)
et libérer(X)) ou ternaire. Un verrou binaire est trop restrictif puisqu'un objet est bloqué pour
toute opération que l'on veut effectuer sur lui, ce qui implique qu'on ne peut faire des lectures
simultanées.
Un verrou ternaire permet 3 états, en lecture (ou partagé), en écriture, ou libre. Le verrou en
écriture n'est alloué que si l'objet est libre, c'est à dire si aucune opération ni de lecture, ni
d'écriture ne s'effectue sur cet objet. Le verrou en lecture est alloué si l'objet est libre ou si
aucune opération d'écriture ne s'effectue sur lui (par contre des opérations de lecture peuvent
se dérouler simultanément, ce qui nécessite de maintenir un compteur pour connaitre le
nombre de transactions "lisant" cet objet).
Un protocole de verrouillage sans aucune contrainte sur l'allocation des verrous, ne permet
pas de garantir la propriété de sérialisabilité. De nombreux protocoles ont été proposés, le plus
classique étant le protocole de verrouillage à deux phases.
Dans ce protocole, toutes les acquisitions de verrous sont faites avant la première libération.
On dit qu'il y a une phase d'expansion suivie d'une phase de libération.
- prévention : on donne un ordre total sur les transactions et on vérifie que les attentes entre
transactions sont conformes à cet ordre (approche par estampillage),
- un n-uplet,
- une relation,
- une base.
Plus la granularité est petite, plus le niveau de concurrence augmente. Par contre le niveau de
complexité de gestion des verrous augmente et les performances baissent.
A priori le choix est dépendant du type des transactions (nature des informations
manipulées). La plupart du temps dans les systèmes commerciaux la granularité est fixe (sauf
indiquée explicitement). Certains systèmes font du verrouillage adaptatif en tenant compte de
la hiérarchie des objets (plutot que de bloquer tous les attributs d'un n-uplet il vaut mieux
bloquer le n-uplet et ainsi de suite). Dans les systèmes actuels le niveau offert est celui du n-
uplet.
La mise à jour différée consiste à ne faire les écritures effectives qu'au moment de la
validation de la transaction. Les modifications sur la base de données sont enregistrées dans le
journal lors de la validation. La procédure de reprise consiste alors à parcourir le journal pour
refaire les opérations d'écriture des transactions validées depuis le dernier point de reprise
(dans l'ordre d'apparition du journal).
Par contre, il n'y a rien à faire pour les transactions non validées (la base de données n'a pas
été mise à jour).
Les écritures sont effectuées sur la base de données immédiatement et les anciennes valeurs
des informations modifiées sont enregistrées dans le journal. La procédure de reprise consiste
alors à :
- refaire les opérations d'écriture des transactions validées depuis le dernier point de reprise
(dans l'ordre d'apparition du journal),
- défaire toutes les opérations d'écriture des transactions invalidées depuis le dernier point de
reprise (dans l'ordre inverse d'apparition).