Conception Et Réalisation (Oracle) by Grare Stéphane - HTML preview

PLEASE NOTE: This is an HTML preview only and some elements such as links or page numbers may be incorrect.
Download the book in PDF, ePub, Kindle for a complete version.

Concepts relatifs au verrouillage

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

index-143_1.png

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