FORMATION D’INGÉNIEURS EN INFORMATIQUE FIIFO IUT d’ORSAY et FACULTÉ des SCIENCES d’ORSAY UNIVERSITÉ PARIS SUD Spécialisation Bases de données G.Ausseresse TRANSACTIONS ET ACCÈS CONCURRENTS Page I. II. INTRODUCTION ....................................................................................................................... 2 GESTION DES TRANSACTIONS............................................................................................. 3 1. Définitions. ............................................................................................................................... 3 2. Contrôle des transactions. ........................................................................................................ 3 III. 1. 2. 3. 4. 5. GESTION DES ACCÈS CONCURRENTS ............................................................................ 5 Introduction .............................................................................................................................. 5 Intégrité des données ................................................................................................................ 5 Concurrence des données ......................................................................................................... 5 Consistance des données .......................................................................................................... 5 Consistance des données en lecture (read consistency) ........................................................... 5 IV. 1. 2. 3. 4. VERROUILLAGE DES DONNÉES....................................................................................... 7 Concepts relatifs au verrouillage.............................................................................................. 7 Verrouillage bloquant .............................................................................................................. 8 Modes d’activation de verrouillage.......................................................................................... 8 Différents types de verrouillage ............................................................................................. 10 V. RÉFÉRENCES........................................................................................................................... 14 FIIFO 582698532 édité le 18/04/2017 00:04:00 I. INTRODUCTION L’un des objectifs d’un SGBD est de mettre à la disposition d’un grand nombre d’utilisateurs un ensemble cohérent de données. En présence de ce grand nombre d’utilisateurs, une attention particulière doit être apportée pour garantir la cohérence des données lors de leur manipulation simultanée par différents utilisateurs. Cette cohérence est assurée à l’aide des concepts de transaction et d’accès concurrents. Ce cours est consacré à la présentation des concepts et mécanismes relatifs aux transactions et accès concurrents. Nous présentons d’abord les concepts et les techniques offerts par Oracle pour gérer les transactions :définition de début et de fin de transaction, validation et annulation d’une transaction, puis le découpage d’une transaction en sous-transactions. Nous présentons ensuite la gestion des accès concurrents dans Oracle. Après avoir donné les concepts de base relatifs aux accès concurrents, nous présentons en détail les différents modes et types de verrouillage de données. 582698532 Page 2 sur 14 II. GESTION DES TRANSACTIONS 1. Définitions. Une transaction est une unité logique de traitements, regroupant un ensemble d’opérations élémentaires (commandes SQL). Ces opérations doivent être exécutés entièrement, soit pas du tout, permettant ainsi à la base de données de passer d’un état cohérent à un nouvel état cohérent. Exemple : Soient les deux commandes suivantes : INSERT INTO ligne_com VALUES (100, 1, 1001, 10) ; et UPDATE article SET qtestock = qtestock – 10 WHERE idarticle = 1001 ; La première commande une nouvelle ligne de commande et la seconde met à jour l’état du stock pour l’article commandé. Pour que la base de données reste dans un état cohérent, ces deux commandes doivent être exécutées et validées. Si, pour une raison quelconque, la seconde commande n’a pas pu être traitée, le système doit annuler la première. Lorsque toutes les opérations constituant la transaction sont exécutées et deviennent effectives, nous disons que la transaction est validée. Les modifications apportées par les opérations élémentaires deviennent alors définitives. Dans le cas contraire où au moins une opération n’a pu être exécutée pour une raison quelconque (condition non vérifiée, accès impossible aux données, panne), nous disons que la transaction est annulée. Les modifications apportées par toutes les opérations élémentaires sont alors annulées et on revient à l’état qu’avait la base avant la transaction. Dans le but d’assurer une souplesse dans la gestion des transactions, il est possible de découper une longue transaction en sous-transactions à l’aide de repères permettant d’effectuer, en cas de besoin, des annulations partielles de la transaction. Cette notion de sous-transaction permet d’effectuer un découpage plus fin des unités de traitement. 2. Contrôle des transactions. Le contrôle des transactions consiste à définir le début et la fin d’une transaction (validation ou annulation) ainsi que son découpage éventuel en sous-transactions. 2.1. Début de transaction 582698532 Page 3 sur 14 Il n’existe pas de commande permettant de marquer explicitement le début d’une transaction. Ce début est implicitement défini par la première commande SQL exécutée ou par la fin d’une transaction précédente. Le début d’une application ou d’une session SQL constitue automatiquement le début d’une transaction. De même, la fin d’une transaction (par validation ou par annulation) marque le début d’une nouvelle transaction. 2.2. Fin de transaction La fin d’une transaction peut être définie explicitement ou implicitement. La fin explicite d’une transaction est réalisée à l’aide des deux commandes COMMIT ou ROLLBACK. La première valide las opérations élémentaires de la transaction et la seconde les annule. Les événements suivants constituent une fin implicite de transaction : Exécution d’une commande de définition de données (CREATE, ALTER, RENAME et DROP) : toutes les opérations exécutées depuis le début de la transaction sont validées. Fin normale d’un programme ou d’une session avec déconnexion d’Oracle : la transaction est validée. Fin anormale d’un programme ou d’une session (sortie sans déconnexion d’Oracle) : la transaction est annulée. 2.3. Découpage d’une transaction. Il est possible, dans Oracle, d’effectuer un découpage d’un transaction en insérant des points de repère (en anglais savepoints). A l’aide de ces points de repère, il est possible d’annuler un sousensemble d’opérations d’une transaction à partir d’un point de repère. La création d’un point de repère se fait à l’aide de la commande suivante : SAVEPOINT point_de_repère ; Pour annuler les opérations à partir d’un point de repère « point_repère », on utilise la commande ROLLBACK en précisant le point de repère. ROLLBACK TO [SAVEPOINT] point_repère ; 582698532 Page 4 sur 14 III. GESTION DES ACCÈS CONCURRENTS 1. Introduction L’une des fonctions du noyau d’un SGBD est d’assurer la gestion des accès concurrents dans les environnements multi-utilisateurs. Selon la norme ANSI/ISO du langage SQL, la gestion des accès concurrents consiste à assurer la sérialisation des transactions multiples accédant simultanément aux mêmes données. Cette sérialisation consiste à s’assurer que l’exécution simultanée d’un ensemble de transactions accédant aux mêmes données donne le même résultat que leur exécution en série. La gestion des accès concurrents est basé sur les concepts d’intégrité, de concurrence et de consistance de données. Elle utilise essentiellement la technique de verrouillage de données. Avant d’aborder les techniques utilisées dans Oracle pour assurer la gestion des accès concurrents, nous allons d’abord présenter les concepts d’intégrité, de concurrence et de consistance des données. 2. Intégrité des données L’intégrité des données est assurée en respectant les différentes contraintes d’intégrité définies lors de la création de la base de données. En particulier, cette intégrité doit être assurée suite à une mise à jour de mêmes données par différents utilisateurs. La base de données doit passer d’un état cohérent avant les mises à jour à un autre état cohérent après les mise à jour. 3. Concurrence des données La concurrence de données consiste à assurer une coordination des accès concurrents de plusieurs utilisateurs aux mêmes données. Plus le nombre d’utilisateurs pouvant accéder simultanément aux mêmes données est grand, plus le degré de concurrence devient important. 4. Consistance des données La consistance des données est assurée lorsque ces données restent inchangées jusqu’à la fin d’une opération de mise à jour ou de lecture, c’est à dire que, lorsqu’un utilisateur utilise ces données en lecture ou en mise à jour, elles doivent rester dans un état consistant (inchangé) jusqu’à la fin de l’opération même si d’autres transactions essaient de la modifier. 5. Consistance des données en lecture (read consistency) 582698532 Page 5 sur 14 Lors du traitement d’une commande de mise à jour, Oracle donne pendant tout le temps du traitement de cette commande la même image des données prise au début de son exécution. Les modifications effectuées par cette commande ne deviennent visibles qu’après sa validation. Exemple : Utilisateur 1 Temps Mise à jour table T t1 t2 Validation de la mise à jour de T Utilisateur 2 Lecture table T t3 t4 Lecture table T La lecture effectuée sur la table T à l’instant t2 par l’utilisateur 2 ne voit pas les modifications apportées par l’utilisateur 1. Par contre, la lecture effectuée à l’instant t4 voit les modifications apportées par l’utilisateur 1 car il y a eu validation à l’instant t3. La consistance des données en lecture est assurée automatiquement par Oracle au niveau des commandes. Il est également possible dans Oracle d’étendre la consistance des données au niveau des transactions. La consistance de données au niveau d’une transaction permet de rendre invisibles les modifications apportées aux données manipulées par la transaction tout au long de son exécution. Exemple : Transaction 1 Début transaction Mise à jour table T Validation Mise à jour table T Validation Temps t0 t1 t2 t3 t4 t5 t6 t7 Transaction 2 Début transaction Lecture table T Lecture table T Validation La mise à jour effectuée par la transaction T1 à l’instant t1 est prise en compte lors de la lecture de la table T par la transaction T2 à l’instant t4, alors que la seconde mise à jour effectuée à l’instant t3 n’est pas prise en compte lors de la seconde lecture effectuée par T2 à l’instant t6 bien qu’elle ait déjà été validée. Les deux lectures donneront donc le même résultat. En l’absence de la consistance de lecture au niveau de la transaction, la seconde mise à jour serait prise en compte lors de la seconde lecture. Nous verrons dans le paragraphe 4.3.2. comment on peut passer de la consistance de lecture du niveau commande (mode par défaut) à une consistance au niveau transaction. 582698532 Page 6 sur 14 IV. VERROUILLAGE DES DONNÉES 1. 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 cas typique d’interaction destructive est la perte de mise à jour. La figure suivante donne un exemple de perte de mise à jour. Transaction T1 Transaction T2 Lecture D1 = 50 Lecture D1 = 50 Calcul D1 = D1 + 10 Calcul D1 = D1 + 20 Ecriture D1 = 60 Ecriture D1 = 70 Validation T1 Validation T2 L’absence de verrouillage de données a pour conséquence la perte de la mise à jour faite par la transaction T1. Au lieu que D1 ait comme résultat final la valeur 80 (50+10+20), elle n’a que 70, car la mise à jour effectuée par T1 n’a pas été prise en compte. Le verrouillage s’applique d’une façon générale à une Ressource. Une ressource peut correspondre aux objets crées par les utilisateurs tels que les tables (ou uniquement quelques lignes d’une table), ainsi qu’aux objets système tels que les éléments du dictionnaire ou des zones de données en mémoire centrale (SGA). Un paramètre important qui affecte les performances est le niveau de verrouillage des données, appelé aussi granule de verrouillage. Ce granule peut être logique (une table, une ligne) ou physique (segment, fichier ou page). La taille du granule influence le degré de concurrence. Un petit granule favorise la concurrence, mais il entraîne des contrôles plus importants. Généralement, les petits granules (ligne) sont mieux adaptés aux transactions courtes ne manipulant qu’un faible volume de données (quelques lignes), alors que des granules plus importants sont mieux adaptés aux transactions lourdes. Certains SGBD modifient d’une façon dynamique le niveau de verrouillage. On parle d’extension du niveau de verrouillage (Lock escalation). Ceci peut arriver, par exemple, lorsque plusieurs lignes d’une même table ont été verrouillées. Le SGBD peut alors verrouiller la totalité de la table. Le granule de verrouillage devient plus grand, mais le nombre de verrous est réduit. Cette technique d’extension du niveau de verrouillage pourrait être une cause des verrouillages bloquants. Oracle n’applique pas cette technique d’extension du niveau de verrouillage. 582698532 Page 7 sur 14 2. Verrouillage bloquant La technique de verrouillage peut entraîner des situations dans lesquelles deux ou plusieurs transactions se trouvent bloquées parce qu’elles utilisent les mêmes ressources. Chacune des transactions se trouve en attente de la libération de ressources utilisées par une autre transaction qui à son tour attend la libération d’autres données pour pouvoir libérer les ressources verrouillées. On parle alors de verrouillage bloquant (deadlock). Exemple : L’exécution simultanée des deux transactions suivantes entraîne un verrouillage bloquant. Transaction T1 Transaction T2 UPDATE article SET prixunit = prixunit * 1.05 WHERE idarticle = 1; UPDATE article SET prixunit = prixunit * 1.05 WHERE idarticle = 2; UPDATE article SET prixunit = prixunit * 1.05 WHERE idarticle = 2; UPDATE article SET prixunit = prixunit * 1.05 WHERE idarticle = 1; COMMIT ; COMMIT ; 3. Modes d’activation de verrouillage Le verrouillage de 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. 3.1. 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. 3.2. 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 : En utilisant la commande : LOCK TABLE nom_table IN mode_verrouillage MODE 582698532 Page 8 sur 14 Avec : nom_table mode_verrouillage nom de la table à verrouiller. mode selon lequel la table sera verrouillée. Il peut être : ROW SHARE, ROW EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE et EXCLUSIVE. La description de chacune de ces modes est donnée dans les sections qui suivent. La table nom_table est ainsi verrouillée selon le mode mode_verrouillage. En utilisant la commande : SELECT liste_sélection FROM nom_table WHERE condition FOR UPDATE; Les lignes de la table nom_table vérifiant la condition ‘condition’ sont verrouilées. La consistance 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 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 de la transaction. Ce mode est appelé mode 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 reste valable jusqu’à la fin de la transaction. Le mode par défaut est ensuite rétabli. Le verrouillage implicite peut être désactivé au niveau global en démarrant une instance avec les deux paramètres d’initialisation suivants : SERIALIZABLE = TRUE ROW_LOCKING = INTENT L’attribution de la valeur TRUE au paramètre SERIALIZABLE entraîne un verrouillage systématique au niveau des tables. Il n’y a donc plus de verrouillage au niveau des lignes. Toute transaction se référant à une table entraîne son verrouillage et interdit donc à toute autre transaction d’utiliser toute ou une partie de cette table. Toutes ces transactions sont exécutées en série et non pas d’une façon concurrente, d’où la dégradation des performances. La valeur par défaut de ce paramètre est FALSE. L’attribution de la valeur INTENT au paramètre ROW_LOCKING interdit la mise à jour (insertion, suppression ou mise à jour) simultanée des lignes d’une table par plusieurs transactions. Deux ou plusieurs transactions peuvent simultanément lire (sélection) ou verrouiller (SELECT … FOR UPDATE) plusieurs lignes, mais les mises à jour ne peuvent être effectuées que lorsque la transaction précédente a libéré la table. 582698532 Page 9 sur 14 La valeur par défaut de ce paramètre est ALWAYS. Elle permet à différentes transactions d’effectuer des mises à jour simultanées sur des lignes différentes d’une même table. Remarque importante : La modification des valeurs par défaut de ces deux paramètres est fortement déconseillée, car elle entraîne une dégradation importante des performances. Les deux cas typiques où ces modifications s’avèrent nécessaires sont l’utilisation d’applications développées avec des versions d’Oracle inférieures à la version 7 ou le souci de compatibilité au mode ANSI/ISO. 4. Différents types de verrouillage La technique de verrouillage peut être appliquée à trois ressources : les données, le dictionnaire de données et la mémoire centrale. A chacune de ces ressources correspond un type de verrouillage. Nous avons donc trois type de verrouillage : Verrouillage des données. Verrouillage du dictionnaire. Verrouillage interne. Dans ce qui suit, nous allons présenter chacune de ces trois types de verrouillage. 4.1. 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 donc lieu aux cinq modes de verrouillage 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 de 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. Dans ce qui suit, nous allons présenter chacun des modes de verrouillage. 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). 582698532 Page 10 sur 14 Ce mode peut être activé : Explicitement à l’aide de la commande : LOCK TABLE nom_table IN ROW SHARE MODE; Ou implicitement lors de la commande de sélection suivante : SELECT … FROM nom_table WHERE … FOR UPDATE ; 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 des 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 de verrouillage sont autorisés, à l’exception des modes suivants : table partagée (S), lignes partagés (RS) 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 partagée peut la mettre à jour (insertion, suppression ou mise à jour) si aucune autre transaction ne l’a verrouillé selon ce mode. Ce mode ne peut être activé qu’explicitement à l’aide de la commande : 582698532 Page 11 sur 14 LOCK TABLE nom_table 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 exécutées. Il n’est possible non plus d’effectuer aucun mode de verrouillage. Ce mode de verrouillage est le plus restrictif. Il ne peut être activé qu’explicitement à l’aide de la commande : LOCK TABLE nom_table IN EXCLUSIVE MODE; Compatibilité entre les modes de verrouillage: Le tableau suivant donne les compatibilités entre les différents modes de verrouillage : Mode de verrouillage RS : Lignes partagées RX : Lignes exclusives S : Table partagée SRX : Partage exclusif de lignes X : Table exclusive Commandes SQL correspondant Select … from … Lock table … in mode Insert into … Update … Delete from … Lock table … in mode Lock table … in Lock table … in exclusive mode for update row share Compatibilité (O/N) avec les autres modes de verrouillage RS RX S SRX X O O O O N O O N N N O O N N O N N N N N N N N N N row exclusive share mode share Lock table … in exclusive mode 4.2. 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, etc…) 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 de ces tables. 582698532 Page 12 sur 14 Le verrouillage du dictionnaire de données est effectué automatiquement par les différentes commandes du langage de définition de données. Il 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 modification ou de la suppression 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 correspondante. 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 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. Etant 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. 4.3. Verrouillage interne Ce troisième type de verrouillage concerne la mémoire utilisée par Oracle pour l’exécution du noyau et des applications. Il est complètement transparent aux utilisateurs. Il existe un type particulier de verrous internes appelés loquets (Latches). Ce sont des mécanismes internes d’Oracle permettant la protection des structures partagées de la SGA telles que la liste des utilisateurs actuels de la base. Ce type de verrouillage est activé et désactivé par les différents processus internes d’Oracle (processus serveurs ou d’arrière-plan). 582698532 Page 13 sur 14 V. RÉFÉRENCES OUVRAGES PUBLIES SQL2, Application à ORACLE, ACCESS et RDB. P. Delmal De Boeck Université, 2000, 3ème édition. Oracle 7, A Abdellatif, M. Limame, A. Zeroual, Eyrolles, 1998, 7ème tirage. 582698532 Page 14 sur 14