Les transactions
• La création d’une base de données ne prenant en charge qu’un
utilisateur simple n’est pas très utile. Le contrôle de multiples
utilisateurs mettant à jour les mêmes données. La simultanéité des
données signifie que de nombreuses personnes peuvent accéder au
mêmes données en même temps, alors que l’uniformité des données
signifie que les résultats visualisés par une personne sont cohérents à
l’intérieur d’une ou plusieurs transactions courantes.
Les transactions
• Une transaction est un ensemble d’ordres SQL qui ont pour objectif
de faire passer la base de données, en une seule étape, d’un état
cohérent à un autre état cohérent.
• Une transaction qui réussit, modifie la base de données dans un
nouvel état cohérent. Si elle échoue (volontairement ou
involontairement), les modification déjà effectuées dans la base sont
annulées (défaites), de sorte qu’elle retrouve l’état cohérent antérieur
au début de la transaction. C’est oracle qui se charge entiérement de
toute cette gestion.
Les transactions
• Les transactions composées d’une suite d'opérations, gagnent à être aussi petites que
possible. Afin qu’une série d'opérations sont considérées comme une transaction, elle
doit présenter les propriétés suivantes:
• Atomicite: Une transaction doit être une unité atomique de travail; elle ne peut réussir
que si toutes ses opérations réussissent.
• Coherence: Quand une transaction est terminée, elle doit laisser les données dans un
état cohérent incluant toute les règles d’intégrité de données.
• Isolation: Les transactions doivent être isolées de changement effectues par d’autres
transaction, soit avant que la transaction ne démarre, soit avant le démarrage de chaque
opération dans la transaction. Ce niveau d’isolation est configurable par l’application.
• Durabilité: Une transaction doit être récupérable aussitôt qu’elle est terminée. Même si
un échec du système se produit après la fin des transacions, les effets de la transaction
sont permanentes dans le système.
Les transactions
• Attention: Bien que de nombreuses personnes considèrent que les
transactions sont des groupes d’instruction SQL, en fait chaque
instruction SQL est une transaction.
• Si une erreur se produit pendant l’exécution d’une simple instruction
SQL, le travail effectue par cette instruction est annule comme s’il ne
s’était jamais produit; c’est le niveau d’instruction uniforme.
• Pour être sur de l’uniformité des données quand on développe des
applications, il suffit de grouper logiquement plusieurs instructions
SQL dans une transaction simple. Celle-ci peut alors traitée comme
unité simple de travail en utilisant les ordres de contrôle des
transactions.
Les transactions
• Une transaction commence à l’ouverture de la session ou à la fin de la
précédente transaction. La toute première transaction débute au
lancement du programme. Il n’existe pas d’ordre explicite de début de
transaction.
• La fin d’une transaction peut être définie explicitement par un
COMMIT ou un ROLLBACK.
Les transactions
• COMMIT: termine une transaction par la validation des données. Il
rend définitives et accessibles aux autres utilisateurs toutes les
modifications effectuées pendant la transaction en les sauvegardant
dans la base de données, et annule tous les verrous positionnes
pendant la transaction (voir mécanisme de verrouillage).
• ROLLBACK: termine une transaction en annulant toutes les
modifications de données effectuées et annule toutes les verrous
positionnes pendant la transaction.
Les transactions
• La fin d’une transaction peut aussi être implicite et correspondre à
l’un des évènements suivants:
• L’exécution d’un ordre de définition d’objet (CREATE, DROP, ALTER,
GRANT, REVOKE, TRUNCATE etc.).
• L’arrêt normal d’une session par EXIT; il se solde par la validation de la
transaction en cours;
• L‘arrêt anormal d’une session par l’annulation de la transaction en
cours.
Les transactions
• La fin d’une transaction peut aussi etre implicite et correspondre à
l’un des evenements suivants:
• L’exécution d’un ordre de definition d’objet (CREATE, DROP, ALTER,
GRANT, REVOKE, TRUNCATE etc.).
• L’arret normal d’une session par EXIT; il se solde par la validation de la
transaction en cours;
• L‘arret anormal d’une session par l’annulation de la transaction en
cours
Les transactions
• En cas d’arret brutal de la machine qui heberge la base de donnees,
Oracle garantit que toutes les transactions déjà validées par un
COMMIT ou un ROLLBACK seront assurées. Au redemarrage de
l’instance efface toutes les transactions en cours qui n’etaient ni
validees, ni supprimees. Ce mecanisme ne necessite aucune
intervention de l’administrateur.
Les transactions
• Il est possible de subdiviser une transaction en plusieurs etapes en
sauvegardant les informations à la fin de chaque etape, tout en
gardant la possibilite soit de valider l’ensemble des mises à jour, soit
de modifier tout ou partie des mises à jour à la fin de la transaction.
• Le decoupage de la transaction se fait en inserant des points de
repere, ou SAVEPOINT.
• Les points de repères (SAVEPOINT) sont des points de controles
utilises dans les transactions pour annuler partiellement l’une d’elles.
Dans ce cas, un savepoint est defini par un identifiant et peut etre
referencé dans la clause ROLLBACK.
Les transactions
• Une transaction peut s’isoler des autres transactions. C’est obligatoire
dans les systèmes de BD à utilisateurs multiples pour maintenir
l’uniformité des données à utilisateurs multiples pour maintenir
l’uniformité des données. La norme SQL-92 définit quatre niveaux
d’isolation pour les transactions s’étendant d’une uniformité très
faible à une uniformité très forte.
• Pourquoi n’employerait on pas le niveau le plus fort pour toutes les
transactions? C’est une question de ressource. Plus le niveau
d’isolation est fort, plus le verrouillage des ressources est intense. De
plus, cela réduit le nombre d’utilisateurs pouvant accéder aux
données simultanément.
Les transactions
• Chacun de ces niveaux d’isolation peut produire certains effets
secondaires connu sous le nom de DIRTY READ (lecture incohérente).
FUZZY READ (lecture non reproductible) et PHANTOM READ (lecture
fantôme). Seules les transactions avec un niveau d’isolation de type
SERIALISABLE sont immunisées.
Lecture incohérente (DIRTY READ)
T1 T2
UPDATE enregistrement
SELECT enregistrement
ROLLBACK
Lecture incoherente
• La transaction T2 met à jour sans poser de verrou; celui-ci est
disponible directement pour les autres transactions (exemple T1).
Cette lecture peut être erronée, particulièrement si la transaction T1
annule l’effet de la modification avec la commande ROLLBACK. La
lecture faite par la transaction T1 est fausse, on la nomme DIRTY
READ (lecture incohérente).
Lecture non répétitive (Fuzzy Read)
T1 T2
SELECT enregistrement
UPDATE (enregistrement)
COMMIT
SELECT enregistrement
Lecture non repetitive
• La transaction T1 consulte un enregistrement (pour contrôler sa
disponibilité par exemple) et, dans la suite de la transaction, le
consulte à nouveau (pour le mettre à jour). Si une seconde
transaction T2 modifie l’enregistrement entre les deux lectures, la
transaction T1 va lire deux fois le même enregistrement, mais obtenir
des valeurs différentes. La lecture faite par la transaction est une
lecture non répétitive.
Lecture fantome
T1 T2
SELECT enregistrement 1
SELECT enregistrement 2
SELECT enregistrement 3
DELETE enregistrement 3
UPDATE enregistrement 1
SELECT enregistrement 4
UPDATE enregistrement 4
SELECT enregistrement 5
INSERT enregistrement 6
Commit
Lecture fantôme
Le choix du juste niveau d’isolation pour vos transactions est important. Bien
que les transactions avec un niveau de type SERIALIZABLE assurent une
protection complète, elles affectent également la simultanéité en raison de
la nature des verrous places sur les donnes.
SHARE la pose de ce type de verrou sur une table empêche toute autre transaction de poser un verrou autre que SHARE sur la
table et d’y acceder en modification. (permits concurrent queries but prohibits updates to the locked table).
ROW EXCLUSIVE la pose de ce type de verrou sur une table indique que des lignes ont été modifiées par des requetes LMD. Il
empêche la pose d’un autre verrou exclusif à partir d’une autre transaction. (is the same as ROW SHARE, but it also prohibits
locking in SHARE mode. ROW EXCLUSIVE locks are automatically obtained when updating, inserting, or deleting).
ROW SHARE la pose de ce type de verrou sur une table permet l’acces concurrent à la table (modifications des lignes
differentes sur chacune des transactions) et empêche toutes autres transactions de poser sur la table entiere un verrou
exclusif. (permits concurrent access to the locked table but prohibits users from locking the entire table for exclusive access).
SHARE ROW EXCLUSIVE Il est identique à un verrou partage, mais il interdit à d’autres utilisateurs d’acquérir un verrou partage
ou de mettre à jour des lignes. Un verrou exclusif de ligne partagée ne peut être acquis qu’en employant l’instruction explicite
LOCK TABLE. (is used to look at a whole table and to allow others to look at rows in the table but to prohibit others from locking
the table in SHARE mode or from updating rows).
Le Verrouillage
Il y’a cinq types de verrous de niveau tables:
1. Le verrou LMD ROW SHARE: C’est un verrou de niveau table qui permet un accès simultanée à la
table, mais interdit aux utilisateurs d’acquérir un verrou exclusif de table. Il fonctionne quand une
transaction emploie SELECT FOR UPDATE (verrou implicite: seules les lignes concernées par la
modification sont verrouillées) pour une mise à jour de lignes dans la table. C’est le mode de
verrouillage le moins restrictif et celui qui fournit la plus grande simultanéité.
2. Le verrou LMD ROW EXCLUSIVE: Ce verrou est place sur la table toutes les fois qu’une instruction
INSERT, UPDATE ou DELETE met à jour une ou plusieurs lignes dans la table. Il permet à des
transactions multiples de mettre à jour la table, aussi longtemps qu’elles ne mettent pas à jour les
mêmes lignes. Il est identique à un verrou partage de lignes, mais il interdit d’acquérir un verrou
partage sur la table.
3. Le verrou LMD SHARE ROW EXCLUSIVE: Il est identique à un verrou partage, mais il interdit à
d’autres utilisateurs d’acquerir un verrou partage ou de mettre à jour des lignes. Un verrou exclusif de
ligne partagee ne peut etre acquis qu’en employant l’instruction explicite LOCK TABLE.
4. Le verrou LMD SHARE: Ce verrou permet des transactions multiples lors de l’interrogation d’une
table, mais seule une transaction avec ce verrou partage peut mettre à jour toutes les lignes. Un
verrou partage ne peut etre acquis qu’en employant l’instruction LOCK TABLE.
5. Le verou LMD EXCLUSIVE: Il permet aux autres utilisateurs d’interroger des lignes dans la table, mais
interdit n’importe quelle autre activite de mise à jour. Un verrou exclusif ne peut etre acquis qu’en
employant l’instruction explicite LOCK TABLE.
Le Verrouillage
Alors qu’Oracle verrouille automatiquement les lignes et les tables en votre nom,
vous pouvez avoir besoin de verrouiller explicitement une table pour assurer
l’uniformité. Les verrous SHARE, SHARE ROW EXCLUSIVE et EXCLUSIVE, peuvent
être acquis explicitement en employant l’expression LOCK TABLE.
Attention: seules les tables peuvent être verrouillées explicitement. Il n’y a aucune
option pour verrouiller explicitement les lignes dans une table.
Le Verrouillage
Les verrous LDD: Un autre type commun de verrou est un verrou LDDD egalement connu sous le nom de
verrou dictionnaire. Ces verrous sont acquis sur le dictionnaire de données, toutes les fois que vous essayez de
modifier la définition d’un objet de BD. Il ya trois types de verrous LDD, EXCLUSIVE, SHARED et BREAKABLE
PARSE.
1. Le verrou LDD EXCLUSIVE: La plupart des operation LDD imposent un verrou exclusif chaque fois que
vous souhaitez changer la définition d’un objet. N’importe quelle transaction qui possede n’importe quel
type de verrou sur une table empeche l’utilisateur d’acquerir un verrou exclusif sur cette table. Il n’y a
rien de reprehensible à empecher le changement de la structure d’une table quand une requete met à
jour une information.
2. Le verrou LDD SHARED: Alors que vous avez besoin d’un verrou exclusif LDD pour changer un objet,
Oracle place des verrous LDD partagés sur les objets que vous réferencez dans les vues, les procedures
stockees, les triggers, etc. Par exemple, toutes les tables qui sont consultées dans une procedure stockee
possedent des verrous LDD pendant l’execution du code. Ceci permet à des transactions multiples de
mettre en reference les tables de base. Cependant, les verrous partagés empêchent l’acquisition d’un
verrou exclusif et le changement des objets references.
3. Le verrou LDD BREAKABLE PARSE: Ce type de verrou est obtenu pendant la phase d’analyse d’une
instruction SQL, aussi longtemps que l’instruction demeure dans le cache de bibliotheque (Library Cache).
Comme son nom l’indique, ce type de verrou peut etre casse chaque fois qu’un objet reference par une
requete dans le cache de la bibliotheque (Library Cache) est change ou abandonne. Cela signale à Oracle
que l’instruction peut ne plus etre valide et que vous devez la recompiler.
Le segment UNDO
Chaque base de données abrite ou plusieurs segments UNDO. Un tel
segment contient les anciennes valeurs des enregistrements en cours
de modification dans les transactions, qui sont utilisées pour assurer
une lecture consistante des donnees, pour annuler des transactions et
en cas de restauration.
Pour gerer à la fois les lectures et les mises à jour, Oracle conserve les
deux informations comme suit:
• Les donnees mise à jour sont ecrites dans les segments de donnees
de la base.
• Les anciennes valeurs sont consignees dans le segment UNDO.
Le segment UNDO
• Ainsi, l’utilisateur de la transaction qui modifie les valeurs lira les
donnees modifiees et tous les autres liront les donnees non
modifiees.
• Chaque fois qu’une instruction INSERT, UPDATE ou DELETE met à jour
une ou plusieurs lignes dans la table, un verrou LMD ROW EXCLUSIVE
est placé. Il permet à des transactions multiple de mettre à jour la
table, tant qu’elle ne mette pas à jour les memes lignes.
Lecture coherente
Une des caracteristique de Oracle est sa capacite à gerer l’acces concurrent aux
donnees c’est-à-dire l’acces simultane de plusieurs utilisateurs à la même donnée.
La lecture consistante, telle qu’elle est prevue par Oracle assure que:
• Les donnees interrogees ou manipulees, dans un ordre SQL, ne changeront pas
de valeur entre le debut et la fin. Tout se passe comme si un SNAPSHOT (un
cliche) était effectué sur la totalite de la baseen debut de l’ordre et que seul les
SNAPSHOT sont utilise tout au long de son execution.
• Les lectures ne seront pas bloquees par des utilisateurs effectuant des
modifications sur les memes donnees.
• Les modifications ne seront pas bloquees par des utilisateurs effectuant des
lectures sur ces donnees.
• Un utilisateur ne peut lire les donnees modifiees par un autre si elles n’ont pas
été validees.
• Il faut attendre la fin des modifications en cours dans une autre transaction afin
de pouvoir modifier les memes donnees.