
Pour que l'exécution simultanée de plusieurs transactions donne le même résultat qu’une
exécution séquentielle, la solution utilisée consiste à verrouiller momentanément les données
utilisées par une transaction jusqu'à la fin de la mise à jour. Les autres transactions
demandant ces données sont mises en attente jusqu'à leur libération (déverrouillage). Cette
technique de verrouillage permet d'éviter les interactions destructives des transactions, c’est-
à-dire les opérations n'assurant pas l'intégrité des données.
Le verrouillage s'applique d'une façon générale à une Ressource. Une ressource peut
correspondre aux objets créés par les utilisateurs tels que les tables (ou uniquement quelques
lignes d’une table), ainsi qu'aux objets système tels que des éléments du dictionnaire ou des
zones de données en mémoire centrale (SGA).
Modes d'activation de verrouillage
Le verrouillage des données peut être activé explicitement par l'utilisateur ou une application
ou implicitement suite à l'exécution d'une commande de définition ou de manipulation de
données.
139
Verrouillage implicite : Le SGBD Oracle effectue automatiquement tous les verrouillages
nécessaires pour le maintien de la cohérence des données. Ces verrouillages sont effectués
sans aucune intervention de l'utilisateur. Par exemple, si plusieurs utilisateurs font UPDATE
sur une même ligne sans valider, le deuxième sera en attente.
Verrouillage explicite : Dans certains cas, l'utilisateur peut ressentir le besoin de contrôler
lui-même les mécanismes de verrouillage des données. Ce contrôle peut se faire au niveau
des transactions ou au niveau d'une instance. Au niveau de la transaction, le verrouillage
explicite peut être activé dans les cas suivants :
1) En utilisant la commande :
LOCK TABLE nom_table IN mode_verrouillage MODE;
avec :
nom_table nom de la table à verrouiller.
mode_verrouillage mode selon lequel la table sera verrouillée. Il peut être : ROW SHARE,
SHARE, ROW EXCLUSIVE, SHARE ROW EXCLUSIVE, et EXCLUSIVE.
La description de chacun de ces modes est donnée dans la suite. La table nom_table est
ainsi verrouillée selon le mode mode_verrouillage.
2) En utilisant la commande :
SELECT liste_selection
FROM nom_table
WHERE condition
FOR UPDATE
Les lignes de la table nom_table vérifiant la condition 'condition' sont verrouillées.
3) La consistante de lecture (read consistency) est appliquée par défaut à toutes les
transactions. Elle a pour conséquence de rendre visible à une transaction T2 toute
modification apportée aux données (et validée) par une transaction T1, même si ces
modifications interviennent pendant le déroulement de la transaction T2. Dans certains cas,
on ne souhaite pas voir les modifications qui ont lieu après le début d'une transaction. Ce
mode est appelé READ ONLY. Pour passer du mode par défaut au mode READ ONLY on
utilise la commande suivante au début d'une transaction :
SET TRANSACTION READ ONLY;
Ce mode :
· Interdis tout Update, Insert, Delete dans la transaction
· Ne rend plus visibles les modifications
Ce mode reste valable jusqu'à la fin de la transaction. Le mode par défaut est ensuite rétabli.
Remarque : Dans tous les cas, si une mise à jour n'a pas été validée, elle n'est pas visible par
les autres utilisateurs.
140
Différents types de verrouillage
La technique de verrouillage peut être appliquée à trois types de ressources : les données, le
dictionnaire de données et la mémoire centrale. À chacune de ces ressources correspond un
type de verrouillage.
Verrouillage des données
Le verrouillage des données, appelé aussi verrouillage du langage de manipulation de
données permet de maintenir la cohérence des données en cas d'accès concurrents. Oracle
utilise deux niveaux de verrouillage des données : Verrouillage des lignes (row locks) et
verrouillage des tables. La combinaison de ces deux niveaux de verrouillage donne lieu aux
cinq verrouillages suivants :
· Mode lignes partagées (Row Share ou RS),
· Mode lignes exclusives (Row exclusive ou RX),
· Mode table partagée (Share ou S),
· Mode partage exclusif de lignes (Share row exclusive ou SRX),
· Mode table exclusive (Exclusive ou X).
Le verrouillage des données prend fin après la validation ou l'annulation d'une transaction.
Lorsqu'une transaction est découpée en sous-transactions, les données verrouillées à partir
d’un point de repère sont libérées dès qu'une annulation partielle de la transaction est
effectuée pour ce point de repère.
Verrouillage en mode lignes partagées (Row Share ou RS) : Ce mode de verrouillage
entraîne un verrouillage sélectif des lignes en vue de leur modification. Lorsqu'une table est
verrouillée en mode lignes partagées, toutes les opérations et tous les autres modes de
verrouillage sont autorisés, à l'exception du verrouillage exclusif de la table (X). Ce mode peut
être activé :
· Explicitement à l’aide de la commande :
LOCK TABLE nom_table IN ROW SHARE MODE;
- Ou implicitement lors de l'exécution de la commande de sélection suivante :
SELECT …
FROM nom_table
WHERE…
FOR UPDATE ;
Dans ce cas, on ne peut pas faire ensuite Update ou Select for Update sur la même ligne.
Ce mode est le moins restrictif et permet donc un haut niveau d'accès concurrents.
Verrouillage en mode lignes exclusives (Row exclusive ou RX) : Ce mode de
verrouillage entraîne aussi un verrouillage sélectif de lignes d'une table lors de leur
modification. Ces lignes ne peuvent pas être partagées par d'autres transactions. Lorsqu'une
table est verrouillée en mode lignes exclusives, toutes les opérations et tous les autres modes
141
de verrouillage sont autorisés, à l’exception des modes suivants : Table partagée (S), lignes
partagées (SR) et table exclusive (X). Ce mode peut être activé :
- Explicitement l'aide de la commande :
LOCK TABLE nom_table IN ROW EXCLUSIVE MODE;
- Ou implicitement lors de l'exécution de l'une des commandes suivantes :
INSERT INTO nom_table ...,
UPDATE nom_table ...;
DELETE FROM nom_table ...;
Ce mode est plus restrictif que le mode RS.
Verrouillage en mode table partagée (Share ou S) : Ce mode permet de verrouiller
entièrement une table tout en permettant aux autres transactions d'effectuer sur cette table
des sélections, des verrouillages en mode lignes partagées (RS) ou en mode table partagée
(S). Il est donc possible d'avoir plusieurs transactions qui effectuent ce mode de verrouillage
simultanément sur la même table. Toutes les opérations modifiant le contenu de la table
(insertion, suppression et mise à jour) ne peuvent pas être exécutées. Il n'est pas possible
non plus de verrouiller cette table en mode partage exclusif de lignes (SRX), ni en mode table
exclusive (X).
Lorsque plusieurs transactions verrouillent simultanément une même table en mode table
partagée (S), aucune de ces transactions ne peut effectuer une mise à jour sur cette table.
Par contre, une transaction ayant verrouillé une table en mode table partagée peut la mettre
à jour (insertion, suppression ou mise à jour) si aucune autre transaction ne l'a verrouillée
selon ce mode. Ce mode ne peut être activé qu'explicitement à l'aide de la commande :
LOCK TABLE nom table IN SHARE MODE;
Verrouillage en mode partagée exclusive de lignes (Share row exclusive ou SRX) :
Avec ce mode de verrouillage, les autres transactions ne peuvent effectuer que des opérations
de sélection ou de verrouillage en mode lignes partagées (SR). Une seule transaction peut
effectuer ce mode de verrouillage sur une table. Toutes les opérations modifiant le contenu de
la table (insertion, suppression ou mise à jour) ne peuvent pas être exécutées. Il n’est pas
possible non plus de verrouiller cette table selon les modes suivants : table partagée (S),
partage exclusif de lignes (SRX) ou table exclusive (X). Ce mode ne peut être activé
qu'explicitement à l'aide de la commande :
LOCK TABLE nom fable IN SHARE ROW EXCLUSIVE MODE;
Ce mode est plus restrictif que le mode table partagée.
Verrouillage en mode table exclusive (exclusive ou X) : Ce mode de verrouillage permet
à la transaction qui le demande d'effectuer une écriture exclusive sur la table. Les autres
transactions ne peuvent effectuer que des opérations de sélection sur cette table. Une seule
transaction peut effectuer ce mode de verrouillage sur une table. Toutes les opérations
modifiant le contenu de la table (insertion, suppression ou mise à jour) ne peuvent pas être
142
exécutées. Il n'est pas possible non plus d'effectuer aucun mode de verrouillage. Ce mode de
verrouillage est le plus restrictif. Il ne peut être activé qu'explicitement à la commande :
- LOCK TABLE nom table IN EXCLUSIVE MODE;
Compatibilité entre les modes de verrouillages : Le tableau suivant donne des
compatibilités entre les différents modes de verrouillage.
Verrouillage du dictionnaire : Le verrouillage du dictionnaire des données, appelé aussi
verrouillage du langage de définition de données, permet de protéger la définition des objets
de la base (tables, vues, utilisateurs, procédures…) lorsque ces objets sont manipulés par des
commandes de définition de données dans une transaction. Par exemple, lors de la création
d'une vue, Oracle verrouille la définition des tables référencées par cette vue, interdisant ainsi
toute modification de structure ou suppression des tables.
Le verrouillage du dictionnaire de données est effectué automatiquement par les différentes
commandes du langage de définition des données. II n'existe donc pas de commandes
explicites de verrouillage analogues à celles du verrouillage des données.
Les objets du dictionnaire de données peuvent être verrouillés selon deux modes :
· Verrouillage exclusif : Il s'agit de verrouiller certaines ressources en mode exclusif de
façon à interdire leur utilisation par toute commande de définition ou de manipulation de
données. C'est le cas de la plupart des commandes de définition de données. Par exemple,
lors de la suppression ou de la modification de structure d'une table, un verrouillage exclusif
est nécessaire afin d'interdire toute utilisation de cette table pendant cette opération.
· Verrouillage partagé : Certaines commandes de définition de données ne nécessitent pas
le verrouillage exclusif de la ressource correspondant. Dans ce cas, un verrouillage partagé
est suffisant. C'est le cas, par exemple, lors de la création d'une vue. Un verrouillage partagé
est suffisant sur les tables de la base. Ce type de verrouillage est utilisé pour les commandes
de création des tables, des vues, des procédures, des synonymes et des packages.
Étant donné que chaque commande de définition de données met fin implicitement à une
transaction, le(s) verrouillage(s) correspondant(s) au niveau du dictionnaire de données
prennent fin juste après l'exécution de la commande.
143