Cette séquence aborde les mises à jour sur des données persistantes. Outre les spécificités de SQL dédiées aux mises à jour, la problématique essentielle des mises à jour que nous allons examiner ici n’est pas tant la performance d’exécution que l’intégrité. En effet, dans un contexte de volume très important des données, la vérification de cette intégrité ne peut être faite par l’utilisateur. De même, la prise en compte de ces contraintes par les programmes manipulant ces données est particulièrement complexe et risquée. Il s’agit donc dans cette séquence d’identifier les sources possible de violation de cette intégrité, afin de mettre en place des méthodes pour y remédier. Ces problèmes sont abordés dans le cadre formel des transactions, mécanisme sur lequel nous passerons une partie de cette séquence, et qui sera approfondi également dans une séquence ultérieure. A noter que, concernant les performances, un travail de longue haleine a été fait par le Transaction Processing Performance Council (TPC : http://www.tpc.org), d'abord dans un contexte purement transactionnel, puis plus récemment dans le contexte des entrepôts de données. 1 Définition de la transaction Les mises à jour sont typiquement des requêtes SQL modifiant les données… 2 Les transactions sont souvent connues via l’acronyme résumant leurs caractéristiques attendues : ACID. 3 D’un point de vue syntaxe, On valide ou on abandonne une transaction via les commandes SQL Commit ou Rollback. De même, une syntaxe est proposée pour définir les contraintes. On distingue couramment 4 types de contraintes : -Les contraintes sur valeur d’attribut, dont on pourrait voir la contrainte de non nullité comme un cas particulier, parce qu’elle se déclare de manière toute à fait spécifique. - les contraintes spécifiques aux bases relationnelles sont les contraintes de clés primaires ou de clés étrangères qui correspondent aux colonnes qui supportent généralement les jointures. 4 On imagine aisément que la modification au sein d’une même transaction à la fois des schémas et des données soit difficile à gérer pour le système. Sous Oracle comme sous nombre de SGBDR, toute modification du schéma termine la transaction précédemment démarrée. 5 Passons très rapidement sur la syntaxe SQL des mises à jour de données en tant que telle. Attention à bien distinguer la mise à jour des données, de la mise à jour du schéma de données qui inclut l’ajout d’une colonne dans une table, la création de vues, la définition des contraintes d’intégrité, par exemple. Les commande de référence pour la modification des données sont insert, delete et update alors que leur équivalent pour la modification de schéma sont respectivement create, drop ou alter (table, view, index, etc ). La commande d’insertion nous donne l’occasion de rappeler l’aspect ensembliste du langage (aussi perceptible dans la présentation de l’algèbre relationnelle). L’insertion consiste à ajouter des lignes (des tuples) dans un tableau (une relation). Mais tandis que dans la première requête, on donne précisément les valeurs insérées dans la table, on insère dans la deuxième requête un ensemble de lignes qui résultent d’une sous-requête. De même, la requête de suppression (commande delete) illustre la sémantique orientée logique de SQL : on identifie les tuples à détruire par leurs caractéristiques (ici, la valeur de son attribut id). Même chose pour la requête en modification qui s’applique encore à un ensemble de tuples, ce qui remplacerait dans un langage de programmation classique 6 l’utilisation d’un itérateur.. 6 L’atomicité est la première propriété d’ACID. Elle consiste à garantir que l’ensemble des mises à jour d’une transaction est exécutée complètement ou pas du tout. En centralisé, l’atomicité est le plus souvent mise en œuvre via des techniques de journalisation. Le principe est de stocker dans un journal (écrit sur le disque, et donc résistant à un plantage soft) la trace de ce qui a été fait pendant la transaction. Les deux méthodes les plus courantes sont les suivantes. A gauche, on inscrit dans le journal toutes les modifications réalisées mais on attend l’ordre de validation pour appliquer ces mises à jour dans la base. Lors de la validation d’une transaction, on inscrit dans le journal l’information et on démarre l’application des mises à jour. En cas de problème pendant cette phase, il suffit de reprendre dans le journal les transactions marquées comme validées et les mises à jour non encore appliquées. Cette méthode est avantageuse quand il y a beaucoup de transactions abandonnées car dans ce cas, il n’y a rien à faire dans la base et juste à indiquer dans le journal l’abandon de la transaction. A droite, la méthode est inverse. On applique les modifications dans la base et on en garde une trace dans le journal qui n’est utilisé qu’en cas d’abandon de transaction. En cas de validation, il n’y a rien à faire parce que la BD est déjà à jour. 7 La cohérence est la deuxième caractéristique des transactions. Une question pertinente à propos de la cohérence est de savoir à quel moment on vérifie les contraintes, au cours de la transaction ou à la fin. La définition de la transaction nous donne un élément de réponse : l’exigence de cohérence est au début et à la fin d’une transaction, pas au milieu. Il n’y a donc pas besoin de vérifier l’intégrité pendant la transaction. Pour des raisons d’efficacité, on est tenté de faire les vérification d’intégrité le plus tôt possible pour éviter de prolonger une transaction qui serait manifestement incohérente. Il existe pourtant des cas où la vérification immédiate des contraintes est impossible. Par exemple, prenons le schéma personne-service (1 personne est membre d’un service qui est lui-même dirigé par une personne). Supposons que les contraintes sont telles qu’une personne est forcément dans un service (la relation personne a un attribut serv_ref qui est non nul et qui référence un service), et qu’un service a forcément un chef qui est une personne, ce qui implique la présence dans Service d’un attribut Chief_ref non nul avec contrainte référentielle vers personne. Alors, la création de la première personne (respectivement du premier service) ne peut se faire que si la vérification d’une des contraintes de clés référentielles est différée. 8 L’isolation est la troisième propriété représentée dans ACID. L’isolation désigne le fait qu’un utilisateur des données doit pouvoir y accéder sans prendre en compte le fait que d’autres utilisateurs soient potentiellement au même moment en train de manipuler ces données. L’isolation sera traitée plus en détail dans le TP dédié aux transactions et dans une séquence de cours spécifique. 9 Enfin, la dernière propriété présente dans ACID est la Durabilité, c’est-à-dire le fait que les effets d’une transaction validée ne sont jamais perdus. Nous avons vu que les techniques liées à l’atomicité permettait de prendre en compte les pannes soft. Nous sommes donc ici plutôt dans une situation de panne disque plus ou moins critique. Cela va de la perte d’un disque à la perte de l’ensemble des supports permanents (incendie d’un immeuble). Nous n’examinerons pas dans ces séquences les solutions existantes. Certaines d’entre elles se sont popularisées dans des outils grands publics tels que les NAS (RAID 0 à 5), qui gèrent la duplication et la répartition de données sur les disques pour être capable de résister à 1, 2 ou davantage de pannes disques. Il y a eu dans le passé quelques événements célèbres où des hébergeurs connus ont rencontrés des pannes plus graves que celles auxquelles ils étaient préparés. On repart alors de backup avec évidemment des pertes de données. Le préjudice vis-à-vis des clients peut être très important. 10 En conclusion, le cadre transactionnel traite une grande part des problématiques de mise à jour. En revanche, certaines caractéristiques du modèle relationnel (l’abstraction par les vues) se comportent moins bien, alors même qu’elles seraient essentielles pour préciser les modalités de contrôle d’accès sur les données de la base. Ce cours peut être approfondi sur 3 des caractéristiques d’ACID : -Concernant l’atomicité, le contexte distribué permet d’étudier des problématiques intéressantes et des solutions connues sous le nom de « validation deux phases » (ou two phase commit). -Concernant la cohérence, la séquence sur les clés primaires est incontournable, d’autant qu’elle est nécessaire pour comprendre une autre séquence de cours dédiées à la structuration des données (théorie de la normalisation) -Concernant l’Isolation, la séquence sur la sérialisabilité et les différentes approches pour la garantir complète lle TP transaction dédié à la même problématique. 11