STOCKAGE TRANSACTION, SÉRIALISABILITÉ, NIVEAUX D'ISOLATION 1
BASE RELATIONNELLE Un serveur de données relationnel : Rend compte de la «réalité» sous forme de table Met en relation la perception logique et l implémentation physique de la modélisation (d où le qualificatif de Relationnel) Rien n est particularisé (pas de pointeurs à câbler) L ordre est sans importance pour stocker des données Répond aux spécifications de l Algèbre Relationnelle élaborée par l anglais Edgar Codd Opérateurs UNION, INTERCEPT, projection (SELECT), restriction (WHERE), produit cartésien (JOINT), prédicats complexes,.. Implémente un langage structuré de requête SQL avec des schémas, clause FROM, possibilité de structurer les requêtes (les sous requêtes), effectuer des jointures et des produits cartésiens, etc. Implémentation des propriétés d acidité (ACID)
POURQUOI UNE TRANSACTION Lier ensemble des opérations qui, logiquement sont indissociables et dont les effets ne peuvent être envisagées séparément. Considérons un exemple d application bancaire 3
EXEMPLE Lire compte courant de Mr X Retrancher 1000 DT Écrire résultat dans compte courant Lire compte professionnel de Mr X Ajouter 1000 DT Écrire résultat dans compte professionnel 4
EXEMPLE SUITE Lire compte courant de Mr X Retrancher 1000 DT Écrire résultat dans compte courant Panne Lire compte professionnel de Mr X Ajouter 1000 DT Écrire résultat dans compte professionnel 5
EXEMPLE SUITE Debut-transaction Lire compte courant de Mr X Retrancher 1000 DT Écrire résultat dans compte courant Lire compte professionnel de Mr X Ajouter 1000 DT Panne Reprise du système jusqu au début de la transaction Écrire résultat dans compte professionnel Fin-Transaction 6
C EST QUOI UNE TRANSACTION Une Transaction, une séquence atomique d actions sur une BD (lectures/écritures) séparant un commit ou un rollback du commit ou du rollback suivant. Chaque transaction doit laisser la BD dans un état cohérent après l avoir prise dans un état cohérent. Les utilisateurs peuvent spécifier des contraintes d intégrité simples sur les données et le SGBD se charge de les garder inviolables. En dehors de ça, le SGBD n a pas conscience de la sémantique des données (ex., il ne comprend pas comment les intérêts d un compte bancaire sont calculés). Le fait qu une transaction préserve la cohérence de la BD est au bout du compte de la responsabilité de l utilisateur! 7
LES MENACES Problèmes de concurrence pertes d opérations introduction d incohérences verrous mortels (deadlock) Panne de transaction erreur en cours d'exécution du programme applicatif nécessité de défaire les mises à jour effectuées Panne système reprise avec perte de la mémoire centrale toutes les transactions en cours doivent être défaites Panne disque perte de données de la base 8
GESTION DES TRANSACTIONS ET L ACIDITÉ Les transactions d une base de données relationnelle sont gouvernées par le principe d acidité. L acidité est une exigence de la norme SQL. Un standard n est pas une norme Concerne les serveurs d applications (J2EE, SAP,..) Elle permet, à la façon d une théorie, de rendre compte fidèlement de ce que l on observe et de pouvoir effectuer des «prédictions» relatives à l intégrité et la cohérence des données. En particulier, elle exige qu il n y ait aucune interférence entre les transactions. ACID Atomicité Consistance Isolation Durabilité
DÉFINITION DES PROPRIÉTÉS ACID Atomicité Les modifications sont préservées en totalité ou complètement annulées (COMMIT, ROLLBACK ou points d'arrêt appelés SAVEPOINT) Consistance La Base passe d'un état cohérent à un état cohérent. Isolation Si une autre transaction s'effectue en concurrence, elle semble s'être déroulée avant ou après (un peu comme si l'on était seul à travailler sur la base) Il existe plusieurs niveaux d'isolation Durabilité (Persistance) Les modifications d'état sont permanentes. Elles sont conservées en cas d'incident (CRASH RECOVERY et MEDIA RECOVERY).
INTERACTIONS ENTRE LES COMPOSANTS CONSTITUTIFS DU SERVEUR DE DONNÉES ORACLE10G Parameter SPFILE Passord File Databas e Shared Pool Library Cache Data Dictionary cache Instance Oracle10g Database buffer Cache Java Pool Streams SGA SID Redo Log buffer Large Pool PMON SMON DBW0 LGWR CKPT ARCH SYSAUX SYSTEM TEMP UNDO DATAFILE Control file REDO multiplexés Optionnels Archive Mode LOG
MULTI VERSIONS ET MULTI UTILISATEURS En concurrence d accès à la base: Une lecture ne doit pas empêcher une écriture Une lecture ne doit pas empêcher une lecture Une écriture ne doit pas empêcher une lecture Une écriture ne doit pas empêcher une écriture Une écriture bloque une écriture qui porte sur la sur la même ligne Dans ce cas, la base est réputée OLTP On Line Transactional Processing (Haut débit transactionnel)
COMMIT ET ABORT INTRODUCTION D ACTIONS ATOMIQUES Commit (fin avec succès) et Abort (fin avec échec) Ces actions s'effectuent en fin de transaction COMMIT Validation de la transaction Rend effectives toutes les mises à jour de la transaction ABORT (Rollback) Annulation de la transaction Défait toutes les mises à jour de la transaction 13
PRIMITIVES DE GESTION DE TRANSACTIONS BEGIN, COMMIT, ROLLBACK BEGIN TRANSACTION UPDATE Compte1 Val = Val -100 IF SQLCODE <> 0 ROLLBACK ; EXIT ; UPDATE Compte2 Val = Val + 100 - Provoque l'annulation des mises à jour - Relâche les verrous IF SQLCODE <> 0 ROLLBACK ; EXIT; COMMIT - Reprend la transaction - Provoque l'intégration réelle des mises à jour dans la base - Relâche les verrous
EFFET LOGIQUE Update Update Mémoire de la transaction Commit Abort Bases de données Poubelle 15
IMPLÉMENTATION DE TRANSACTIONS TID : Identificateur de transaction Inscription dans la BD seulement après le COMMIT Journalisation: Toute opération d'une transaction est notée avant et après l'exécution dans un fichier journal présumé à l'abris de pannes Les opérations de commitement sont notées avant d'être exécutées sur la BD (write- ahead log protocol) Points de reprise (checkpoints) sauvegardes de l'état de la BD et notamment de TIDs de transactions en cours à intervalles réguliers
ET SI LA CASSE ARRIVE... On ferme l'accès à la base On reprend le dernier checkpoint On retrouve sur le journal toutes les transactions commises après commencées avant ou après le checkpoint On reexécute chronologiquement ces transactions et seulement ces transactions On rouvre la base aux usagers
TRANSACTIONS NON-ACID Transactions imbriquées Transactions longues Transactions distribuées exigent un commitement à 2 phases (2 PC)
JOURNAUX ET SAUVEGARDE Journal des images avant Journal contenant les débuts de transactions, les valeurs d'enregistrement avant mises à jour, les fins de transactions (commit ou abort) Il permet de défaire les mises à jour effectuées par une transaction Journal des images après Journal contenant les débuts de transactions, les valeurs d'enregistrement après mises à jour, les fins de transactions (commit ou abort) Il permet de refaire les mises à jour effectuées par une transaction 19
JOURNAL DES IMAGES AVANT Utilisé pour défaire les mises à jour : Undo 2.Log Page lue Page modifiée 3.Update 1.Read 4.Write Base de données 20
JOURNAL DES IMAGES APRÈS Utilisé pour refaire les mises à jour : Redo 3.Log Page lue Page modifiée 2.Update 1.Read 4.Write Base de données 21
GESTION DU JOURNAL Journal avant et après sont unifiés Écrits dans un tampon en mémoire et vider sur disque en début de commit Structure d'un enregistrement : N transaction (Trid) Type enregistrement : {début, update, insert, commit, abort} TupleId (Attribut modifié, Ancienne valeur, Nouvelle valeur)... Problème de taille on tourne sur N fichiers de taille fixe possibilité d'utiliser un fichier haché sur Trid/Tid 22
SCÉNARIOS DE REPRISE Les mises à jour peuvent être effectuées directement dans la base (en place) la base est mise à jour immédiatement, ou au moins dès que possible pendant que la transaction est active Les mises à jour peuvent être effectuées en mémoire et installées dans la base à la validation (commit) le journal est écrit avant d'écrire les mises à jour 23
STRATÉGIE DO-UNDO Mises à jour en place l'objet est modifié dans la base Utilisation des images avant copie de l'objet avant mise à jour utilisée pour défaire en cas de panne Update Mémoire cache 1. LirePage 2. LogPage 3. WritePage Journal avant Undo Base 24
STRATÉGIE DO-REDO Mises à jour en différentiel l'objet est modifié en page différentielle (non en place=ombre) Utilisation des images après copie de l'objet en journal après mise à jour (do) utilisée pour refaire en cas de panne (redo) Update Mémoire cache 1. LirePage 3. LogPage 2. WritePage Journal après Redo Base Ombre Commit 25
LA GESTION DES BUFFERS Bufferisation des journaux on écrit le journal lorsqu'un buffer est plein ou lorsqu'une transaction commet Bufferisation des bases on modifie la page en mémoire le vidage sur disque s'effectue en différé (processus E/S) Synchronisation journaux / base le journal doit toujours être écrit avant modification de la base! 26
REPRISE À FROID En cas de perte d'une partie de la base, on repart de la dernière sauvegarde Le système retrouve le checkpoint associé Il ré-applique toutes les transactions commises depuis ce point (for each committed Ti : redo (Ti)) 27
PROBLÈMES DE CONCURRENCE Objectifs de la concurrence: Permettre l exécution simultanée d un grand nombre de transactions Régler les conflits lecture / écriture Garder de très bonnes performances Éviter les blocages 28
PROBLÈME DE CONCURRENCE Nécessité d'exécuter les programmes et requêtes de façon concurrente Garantir que l exécution simultanée de plusieurs programmes se fait correctement Cohérence de la base de données Exécution correcte des programmes Exemples de contextes hautement concurrentiels: annuaires téléphoniques (accès en lecture) systèmes de réservation de billets (lecture et mise à jour) 29
CONTRÔLE DE CONCURRENCE Phénomènes indésirables : Lecture sale : Une transaction lit des données écrites par une transaction Lecture non reproductible : Une transaction lit de nouveau des données qu il a lues précédemment et trouve que les données ont été modifiées par une autre transaction (qui a validé depuis la lecture initiale) Lecture fantôme : Une transaction ré-exécute une requête renvoyant un ensemble de lignes satisfaisant une condition de recherche et trouve que l ensemble des lignes satisfaisant la condition a changé à cause 30 d une transaction récemment validée.
INFÉRENCES ENTRE ÉCRIVAINS PERTE D OPÉRATION (LOST UPDATE) 1ere transaction Temps 2eme transaction READ D X=D+1 WRITE D=X READ D Y=D*2 WRITE D=Y La mise à jour faite par la 1ère transaction est perdue. 31
ECRITURE INCONSISTANTE (ANG. DIRTY WRITE) 1ere transaction Temps 2eme transaction READ C C=C+100 WRITE C ROLLBACK READ C IF C>500 THEN D=D+500 WRITE D Initialement, C le crédit d un compte est < 500. Une 1ère transaction modifie le crédit C d'un compte. Une 2ème lit C dans ce nouvel état, puis, constatant que la provision est suffisante, modifie le débit D du compte. Après annulation de la 1ére transaction, la contrainte d'intégrité D C n est plus vérifiée. 32
ENTRE LECTEURS ET ÉCRIVAINS LECTURE INCONSISTANTE (ANG. DIRTY READ) 1ere transaction Temps 2eme transaction READ A A=A-100 WRITE A READ B B=B+100 WRITE B COMMIT READ A READB La 1ère transaction a pour but de faire un virement entre deux comptes A et B, qui satisfait la contrainte d'intégrité "somme A+B invariante". La deuxième transaction lit A et B juste après que la 1ére transaction ait déduit 1000 de A. Elle trouve A+B diminué. 33
ENTRE LECTEURS ET ÉCRIVAINS LECTURE NON REPRODUCTIBLE (ANG. NON- REPEATABLE READ) ) 1ere transaction READ P READ P READ P Temps 2eme transaction READ P P=P-2 WRITE P COMMIT Une 1ère transaction consulte les places libres dans un avion et laisse un temps de réflexion à l'utilisateur. Entre temps, une 2ème transaction, qui voit les mêmes places libres, valide deux réservations. La 1ère demande à nouveau les places libres: la liste est diminuée alors qu'elle n'a pas encore choisi ses réservations! 34
ENTRE LECTEURS ET ÉCRIVAINS LECTURE FANTÔME (ANG. PHANTOM READ)) 1ere transaction READ P READ P READ P Temps 2eme transaction READ P P=P+1 WRITE P ROLLBACK Cas identique au précédant mais avec libération au lieu de réservation de place par la 2ème transaction. Il n'y a pas alors de conflit à proprement parler mais seulement interrogation sur la validité de ces "apparitions fantômes". 35
TERMINOLOGIE ET NOTATION Ti: une transaction de numéro i. Ri: une opération de lecture (read) de Ti. Wi: une opération d écriture (write) de Ti. Ri(x): une opération de lecture sur l objet x, x étant un objet manipulé par Ti (p.e.: ligne, colonne, ). Wi(x): une opération d écriture sur l objet x. Exple: Transaction 1 Transaction 2 R1(x) R2(x) x = x +5 R2(y) W1(x) R2(z) R1(y) x = x + y + z z = x + y W2(x) W1(z) 36
TERMINOLOGIE Ordonnancement ( schedule) T1 = R1(x), W1(x), R1(y), W1(Z) T2 = R2(x), R2(y), R2(z), W2(x) S={R1(x), W1(x), R1(y), W1(Z), R2(x), R2(y), R2(z), W2(x)} S est un ordonnancement en série (sériel, serial); toutes les opérations de T1 précèdent celles de T2 (+) Aucun conflit entre les transactions. (-) problème de performance Les mécanismes de contrôle de concurrence tentent d interfolier ( interleave) les opérations de lecture et d écriture de plusieurs transactions; de manière à toujours assurer un résultat identique à un ordonnancement en série. 37
PROPRIÉTÉS D EXÉCUTION Recouvrabilité : Possibilité d annuler l effet d une transaction qui abandonne (abort). Solution : Ordre des Commit effectués par les transactions suit l ordre de dépendances Lecture(X)/Ecriture(X). Exemple Conséquence sur l exemple : le nombre de places disponibles a été diminué par T1 et repris par T2, avant que T1 n annule ses réservations. Le nombre de sièges réservé sera plus grand que le nombre effectif de clients ayant validé leur réservation 38
PROPRIÉTÉS D EXÉCUTION Sans Abandons en Cascade (Cascadeless) : la lecture d une valeur écrite par une transaction T ne peut se faire qu une fois T a réalisé son Commit. Cascadeless ----> Recouvrable exemple Ici, le rollback de T1 intervient sans que T2 n ait validé. Il faut alors impérativement que le système effectue également un rollback de T2 pour assurer la cohérence de la base : on parle d annulations en cascade (noter qu il peut y avoir plusieurs transactions à annuler).. Solution :la lecture d une valeur écrite par une transaction T ne peut se faire qu une fois T a réalisé son Commit.39
PROPRIÉTÉS D EXÉCUTION Strict : l écriture d une valeur déjà affectée par une autre transaction T ne peut se faire qu une fois T a réalisé son Commit. Exemple Ici il n y a pas de dearty read mais une dearty write. En effet T1 a validé après que T2 ait écrit dans s. Donc la validation de T1 enregistre la mise-à-jour de T2 alors que celle-ci s apprête à annuler ses mises-à-jour par la suite. Au moment où T2 va annuler, le gestionnaire de transaction doit remettre la valeur du tuple connue au début de la transaction : ce qui revient à annuler la mise-à-jour de T1 Solution : Cascadeless + retarder les Write(X) jusqu à ce que les écritures effectuées par d autres transactions sur X soient validées (commit). 40
PROPRIÉTÉS En résumé, on distingue trois niveaux de recouvrabilité selon le degré de contrainte imposé au système : 1. Recouvrabilité : on ne doit pas avoir à annuler une transaction déjà validée. 2. Annulation en cascade : un rollback sur une transaction ne doit pas entraîner l annulation d autres transactions. 3. Recouvrabilité stricte : deux transactions ne peuvent pas accéder simultanément en écriture à la même donnée, sous peine de ne pouvoir utiliser la technique de récupération de l image avant 41
NOTION D ÉQUIVALENCE Deux opérations sont conflictuelles ssi Elles opèrent sur le même objet, Au moins une des 2 opérations est une écriture, Chacune des opérations à une transaction différente. Exemple d opérations conflictuelles: T1 = R1(x), W1(x), R1(y), W1(Z) T2 = R2(x), R2(y), R2(z), W2(x) (R1(x), W2(x)), (W1(x), R2(x)), (W1(x), W2(x)), (W1(z), R2(z)) Deux exécutions sont équivalentes si: Les mêmes actions (lecture, écriture) se retrouvent dans les mêmes transactions Chaque paire de d actions conflictuelle (lecture/écriture, écriture/lecture ou écriture/écriture) sont ordonnées de la même façon dans les deux exécutions 42
EXÉCUTION SÉRIALISABLE Une exécution S est sérialisable si S est équivalente à une exécution en série des mêmes transactions Exemple : Soit le programme réservation de spectacle, représenté par la séquence suivante : r(s) r(c) w(c) w(s) r : Lecture (Read) w : Ecriture (Write) s : Séance c : Client 43
Exécution sérialisable Soient deux transactions T1 et T2, chacun voulant réserver des places pour la même séance pour deux clients distincts c1 et c2. Soit la situation suivante : Il reste 50 places libres pour la séance s T1 veut réserver 5 places pour la séance s T2 veut réserver 2 places pour la séance s Soit le déroulement imbriqué de ces deux réservations r1(s) r1(c1) r2(s) r2(c2) w2(s) w2(c2) w1(s) w1(c1) T1 lit s et c1 : places libres 50 T2 lit s et c2 : places libres 50 Pbm!! Il reste 45 places libres T2 écrit s : 50-2 = 48 alors que 7 places ont été T2 écrit le nouveau compte de c2 T1 écrit s : 50-5 = 45 réservées : T2 lit et modifie une information que T1 a déjà T1 écrit le nouveau compte de c1 lue en vue de la modifier 44
EXÉCUTION SÉRIALISABLE Solution1 : Exécuter en série les transactions, on bloque une tant que la précédente n a pas fini son exécution. r1(s) r1(c1) w1(s) w1(c1) r2(s) r2(c2) w2(s) w2(c2) Dans ce cas, pas de problèmes. T2 lit une donnée écrite par T1 qui a terminé son exécution et ne créera donc pas d interférences. Cette solution n est pas acceptable, on ne peut pas se permettre de bloquer tous les utilisateurs sauf un, en attente d une transaction qui peut durer très longtemps 45
EXÉCUTION SÉRIALISABLE Solution2 : Exécution entremele de T1et T2 r1(s) r1(c1) w1(s) r2(s) r2(c2) w2(s) w1(c1) w2(c2) T1 lit s et c1 : places libres 50 T1 écrit s = 50 5 = 45 T2 lit s : places libres 45 T2 lit c2 T2 écrit s = 45 2 = 43 T1 écrit le nouveau compte de c1 T2 écrit le nouveau compte de c2 Le résultat obtenu est le même obtenu par une exécution en série, on parle alors de sérialisabilité 46
SÉRIALISABILITÉ Hypothèses: Exécution d'une transaction individuelle est correcte Exécution de transactions en série (les unes derrière les autres) est correcte Idée: se ramener à une exécution de transactions en série Concept de sérialisabilité 47
GRAPHE DE DÉPENDANCES Il est possible de déterminer la sérialisabilité d'une exécution. On met en oeuvre des relations de précédence entre les transactions. Une fois toutes les relations de précédence établies, on peut générer un graphe dit de dépendance (précédence) Théorème: Une exécution est sérialisable ssi son graphe de dépendance ne comporte pas de cycle Graphe dépendances : Un noeud par transaction; liens de Ti à Tj si Tj effectue une lecture/écriture d une granule précédemment écrit par Ti, ou si Tj effectue une écriture d un granule précédemment lu par Ti. 48
GRAPHE DE DÉPENDANCES 1. Chaque transaction est un noeud du graphe; 2. Pour un objet O : Si une transaction T1 fait une écriture de l'objet O avant qu'une transaction T2 ne fasse une opération sur cet objet alors, dans le graphe, T1 précède T2 : Cette relation de précédence est concrétisée par un arc orientée de T1 vers T2. 3. Pour un objet O : Si une transaction T1 fait une lecture sur l'objet O avant qu'une transaction T2 ne fasse une opération d'éciture sur cet objet, alors, dans le graphe, T1 précède T2: 4. L'exécution est sérialisable si et seulement si le graphe ne présente aucun cycle. 49
GRAPHE DE DÉPENDANCES T1 T2 T3 Lire (X) Ecrire (X) Lire (Y) Ecrire (Y) Lire (Z) Lire (Y) Ecrire (Y) Lire (X) Ecrire (X) Lire (Y) Lire (Z) Ecrire (Y) Ecrire (Z) - Définir pour chaque objet la liste des transactions qui accèdent a l'objet par ordre chronologique. - dresser le graphe pour determiner si c est serialisable ou non 50
GRAPHE DE DÉPENDANCES Pour L'objet X: Lecture de T1, Ecriture de T1, Lecture de T2, Ecriture de T2. Relation de précédence: T1 précède T2. Pour l'objet Y: Lecture de T2, Ecriture de T2, Lecture de T3, Ecriture de T3, Lecture de T1, Ecriture de T1. Relation de précédence: T2 ecrit avant T3 donc T2 précède T3; T3 ecrit avant T1 donc T3 précède T1. Pour l'objet Z: Lecture de T2, Lecture de T3, Ecriture de T3. Relation de précédence: Le fait que T2 lise avant que T3 ne lise ne provoque pas de conflit. Cependant, la précédence doit être exprimée ici, parce que T3 fait par la suite une opération d'écriture sur Z. 51
GRAPHE DE DÉPENDANCES Toutes les transactions sont représentées par des noeuds. On indique que T1 précède T2 en dessinant une flèche de T1 vers T2. Pour plus de clarté, on peut mettre sous chaque flèche, l'objet a partir duquel a été déduite la relation représentée par la flèche. Le graphe de précédence ressemble alors a ce qui suit: X T1 T2 L exécution donnée n est pas serialisable Y T3 Y,Z 52
GRAPHE DE DÉPENDANCES Exemple2 : T1 T2 T3 Lire (X) Ecrire (X) Lire (Y) Ecrire (Y) Lire (Z) Lire (Y) Lire (Z) Ecrire (Y) Ecrire (Z) Lire (Y) Ecrire (Y) Lire (X) Ecrire (X) 53
GRAPHE DE DÉPENDANCES Pour L'objet X: Lecture de T1, Ecriture de T1, Lecture de T2, Ecriture de T2. Relations de précédence: On détermine sans difficulté que T1 précède T2. Pour l'objet Y: Lecture de T3, Ecriture de T3, Lecture de T1, Ecriture de T1, Lecture de T2, Ecriture de T2. Relations de précédence: T3 écrit avant T1 donc T3 précède T1; T3 écrit avant T2 donc T3 précède T2; T1 écrit avant T2 donc T1 précède T2. Pour l'objet Z: Lecture de T3, Ecriture de T3, Lecture de T2. Relations de précédence: T3 écrit avant T2 donc T3 précède T2. 54
GRAPHE DE DÉPENDANCES T1 X,Y T2 Il n'y a pas de cycle dans ce graphe de sérialisabilite. L execution est serialisable. Y Z T3 55
APPROCHE DE LA GESTION DE LA CONCURRENCE Objectif: forcer la sérialisabilité Deux méthodes: Verrouillage Estampillage Verrouillage: L idée est simple : on bloque l accès à une donnée dès qu elle est lue ou écrite par une transaction («pose de verrou») et on libère cet accès quand la transaction termine par commit ou rollback («libération du verrou») Le verrou partagé (SLocks) est typiquement utilisé pour permettre à plusieurs transactions concurrentes de lire la même ressource. Le verrou exclusif (XLocks) réserve la ressource en écriture à la transaction qui a posé le verrou. 56
VERROUS EXCLUSIF : PROTOCOLE PXO Définition: un verrou est dit exclusif s'il interdit toute autre obtention d'un verrou, de quelque type que ce soit, sur l'élément verrouillé, par une autre transaction. Verrous exclusifs avec libération explicite Toute demande d accès contient implicitement une demande de verrouillage (Lire XLire). Toute transaction qui a besoin d une ressource qui est actuellement verrouillée est mise en attente (FIFO). L'obtention du verrou autorise lectures et mises à jour Un verrou peut être relâché explicitement (XRelâcher) à n importe quel moment. Au plus tard, il est relâché implicitement à la fin de la transaction. 57
VERROUILLAGE EXCLUSIF: EXEMPLE ET PROBLÈMES 58
SOLUTIONS DES INTERBLOCAGES Deux approches: Détection: laisser les transactions se mettre en interblocage, le détecter puis le résoudre. Grâce au graphe de dépendances : un interblocage: un cycle dans le graphe Quand faire la détection? lors des demandes de verrouillage périodiquement après un certain temps d attente pour une transaction Action: tuer l une des transactions celle qui a fait le moins de maj la plus jeune celle qui a le moins de ressources allouées Tuer: défaire (annuler ses maj, ses verrous) puis relancer automatiquement plus Tard Prévention: prévenir les interblocages. En pratique, solution détection la plus souvent utilisée car prévention plus coûteuse. 59
MÉCANISMES DE VERROUILLAGE La consistance est assurée grâce aux mécanismes de verrouillage. Ces mécanismes garantissent la réservation temporaire de ressources à une transaction. Un SGBDR offre plusieurs niveaux de verrouillage, appelés granularité: Logique, sur table ou sur une ligne Physique, sur segment, fichier ou page 60
MÉCANISMES DE VERROUILLAGE Oracle8 n offre que le niveau logique: Verrouillage au niveau de la ligne (type TX). Juste les lignes modifiées par la transaction sont verrouillées On doit disposer de l option TPO (Transaction Processing Option), mise en œuvre par le paramètre ROW_LOCKING=ALWAYS du fichier init.ora Verrouillage au niveau de la table (type TM) Toutes les lignes de la table sont verrouillées Les autres transactions continuent à consulter les datas de la table, y compris ceux qui sont modifiées 61
MÉCANISMES DE VERROUILLAGE On peut utiliser les verrous pour verrouiller: Les datas : (data locks ou DML) DML protègent les datas de l user. Le dictionnaire de datas (dictionary lock) : ce qui permet de protéger la description des structures de datas La définition de la table ne peut pas être modifiée pendant une transaction Les Objets systèmes (SGA, buffer, ). Ce qu on appelle par verrous internes (latches) Automatiques 62
LES DIFFÉRENTS TYPES DE VERROUILLAGE Les verrous TX (ligne) et TM (table) sont aussi classés selon deux catégories: Verrou exclusif Verrou partagé Alors, les différents type de verrouillage sont: Verrouillage exclusif de la table (X) Verrouillage de la table en mode partagé (S) Verrouillage sélectif des lignes (RS) Verrouillage exclusif des lignes (RX) 63 Verrou exclusif Verrou partagé Verrou ligne RX RS Verrou table X S
MISE EN ŒUVRE DES VERROUS Verrouillage implicite géré par le SGBDR. Ce type de verrouillage assure la consistance et l'intégrité des données INSERT, UPDATE et DELETE posent automatiquement un verrou RX sur la table concernée. SELECT ne demande jamais de verrou. Possibilité d exécuter un SELECT sur une table même si il y a des verrous sur la table ou sur ses lignes. SELECT FOR UPDATE permet de réserver, en vue d une maj ultérieure, les lignes qui sont consultées. Un verrou RS est allouée donc sur la table Verrouillage explicite par la commande LOCK En complément du verrouillage implicite, nous pouvons définir une stratégie de verrouillage. Il est fortement déconseillé d utiliser le LOCK TABLE car le verrouillage automatique d Oracle (à partir de 6.x) est plus performant que le mode manuel 64
VERROUILLAGE EXCLUSIF DE LA TABLE (X) C'est le mode le plus restrictif, il assure aux Tr qui l'obtient un accès exclusif en écriture sur une table par la commande : LOCK TABLE table IN EXCLUSIVE MODE; Opérations Seule une Tr peut avoir un accès en mode X pour une table Les autres Tr peuvent consulter les datas de la table mais ne peuvent ni les modifier, ni poser des verrous sur la table et sur ses lignes. 65
VERROUILLAGE DE LA TABLE EN MODE PARTAGÉ (S) Commande LOCK TABLE table IN SHARE MODE; Opérations Les autres Tr peuvent mettre différents verrous en mode partagé sur la table (RS ou S) Une Tr qui verrouille une table en mode S empêche les autres transactions de demander des verrous de type SRX ou X. 66
VERROUILLAGE SÉLECTIF DES LIGNES (RS) Il est acquis de manière automatique si l'une des commandes SQL suivante est exécuté: SELECT... FROM table... FOR UPDATE OF... ; LOCK TABLE table IN ROW SHARE MODE; Opérations Ce verrou est le moins contraignant. Il permet aux autres Tr de mettre à jour les datas autres que celles concernées par la Tr qui a demandé le verrou (RS). En revanche, aucune autre transaction ne peut demander de verrou de type X. 67
VERROUILLAGE EXCLUSIF DES LIGNES (RX) Ce mode est acquis de façon automatique pour une table modifiée par l'une des instructions suivantes : 68 INSERT INTO table...; UPDATE table...; DELETE FROM table...; LOCK TABLE table IN ROW EXCLUSIVE MODE; Opérations: Ce mode empêche d'autres Tr de verrouiller manuellement la table en mode S, X ou SRX La Tr qui a mis le verrouillage peut modifier un ou plusieurs les lignes de la table
DML LOCKS Le tableau suivant résumera les combinaisons possibles des divers modes de verrouillage que peuvent demander des transactions simultanées sur la même table. X Verrou obtenu par une transaction Verrous impossibles pour les autres transactions RS, RX, S, X Verrous possibles pour les autres transactions 69 S RX, X RS, S RX S, X RX, RS RS X RS, RX, S
GESTION DES VERROUS Le gestionnaire de verrou maintient une table de verrous qui contient pour chaque objet sur lequel il y a un (ou des) verrou(s) : le nombre de transactions portant sur l objet la nature des verrous (partagé ou exclusif) un pointeur vers une queue de demandes de verrous Le SGBD maintient aussi la description des transactions dans une table des transactions qui contient : des pointeurs vers une liste de verrous posés par chaque transaction 70
CONTRÔLE DE CONCURRENCE : PROTOCOLE DE S2PL Le protocole de verrou «Strict 2-Phase Locking» est basé sur deux règles : Si une transaction T veut lire (resp. modifier) un objet, il demande d abord un verrou partagé (resp. un verrou exclusif) sur l objet Tous les verrous posés par une transaction sont relâchés lorsque la Tr se termine 71
CONTRÔLE DE CONCURRENCE : PROTOCOLE DE S2PL Sans verrou T1 R(A) W(A) R(B) W(B) Commit T2 R(A) W(A) R(B) W(B) Commit Protocole S2PL T1 T2 X(A) R(A) W(A) X(B) R(B) W(B) Commit X(A) R(A) W(A) X(B) R(B) W(B) Commit 72
CONTRÔLE DE CONCURRENCE : PROTOCOLE DE S2PL Limite du protocole S2PL: Temps d attente pour la Tr qui n a pas obtenu en premier le verrou Nécessité donc d un autre protocole qui ne pénalise pas les Tr 73
CONTRÔLE DE CONCURRENCE : PROTOCOLE DE 2PL Le protocole de verrou «2-Phase Locking» est basé aussi sur deux règles : Si une transaction T veut lire (resp. modifier) un objet, il demande d abord un verrou partagé (resp. un verrou exclusif) sur l objet Une transaction peut relâcher un verrou avant de se terminer, mais elle ne peut plus redemander de verrou une fois qu elle en a relâché un Toute Tr est alors composée de deux phases : la phase croissante : demandes de verrous la phase décroissante : relâchements de verrous une Tr ne relâche un verrou sur un objet que si elle est sûre que celui-ci ne sera plus utilisé (ni en lecture ni en écriture) une Tr ne relâche les verrous sur un objet que si elle est sûre que plus aucun verrou ne sera posé sur les autres objets 74
CONTRÔLE DE CONCURRENCE : PROTOCOLE DE 2PL Sans verrou T1 R(A) W(A) R(B) W(B) Commit T2 R(A) W(A) R(B) W(B) Commit Protocole 2PL T1 T2 X(A) R(A) W(A) X(B) Rel(A) T1... T2 X(A) R(A) W(A) R(B) W(B) Rel(B) Commit 75 T2 X(B) Rel(A) R(B) W(B) Rel(B) Commit...
CONTRÔLE DE CONCURRENCE : DEADLOCK Conflit WW classique Avec le S2PL Avec le 2PL T1 W(A) W(B) Commit T2 W(B) W(A) Commit T1 X(A) W(A) ) ) T2 X(B W(B X(A Impossible que T2 met un ) verrou sur A puisque T1 a déjà mis un verrou exclusif sur A : Blocage T1 X(A) W(A) T2 76 X(B) W(B) X(A) Rel(B) Pour pouvoir relâcher le verrou sur B, T2 doit mettre un verrou sur A, ce qui est impossible puisque T1 a déjà mis un verrou exclusif sur A : Blocage
CONTRÔLE DE CONCURRENCE: DEADLOCK Problème de deadlock (DL) Un DL peut survenir quand deux ou +sieurs users sont en attente d'une ressource mutuellement verrouillée par chacun d'entre eux, Oracle détecte automatiquement les DL et le résout par l'annulation de l'une des commandes qui l'a entraîné un message est envoyé aux Tr concernées. C'est la Tr qui détecte en premier le DL qui est annulée. Graphe d attente chaque noeud identifie une transaction active il y a un arc de Ti vers Tj ssi Ti attend que Tj aie relâché un verrou pour continuer si le graphe contient un cycle, il y a DL T1 T2 77 T3
RÉSOLUTION DU DL Prévention versus Détection? Prévention définir des critères de priorité de sorte à ce que le problème ne se pose pas exemple : priorité aux transactions les plus anciennes ou priorité aux transactions qui ont le plus de verrous ou priorité aux transactions qui ont le plus de verrous Détection gérer le graphe des attentes lancer un algorithme de détection de circuits dès qu une transaction attend trop longtemps choisir une victime qui brise le circuit 78
CONTRÔLE DE CONCURRENCE SANS VERROU Contrôle de concurrence par estampillage : Chaque transaction reçoit une date de début (estampillage) Si une action a i de la transaction T i est en conflit avec l action a j de la transaction T j et TS(T i ) > TS (T j ) alors T i est abandonnée 79
GESTION DES ACCÈS CONCURRENTS ET SQL Il est possible en SQL de choisir explicitement le niveau de protection que l'on souhaite obtenir contre les incohérences résultant de la concurrence d'accès. Options possibles : 1) On spécifie qu'une transaction ne fera que des lectures SET TRANSACTION READ ONLY; 2) Une transaction peut lire et écrire (Option par défaut) SET TRANSACTION READ WRITE; 80
SQL2 ET LES PROPRIÉTÉS DES EXÉCUTIONS CONCURRENTES La norme SQL2 spécifie que ces exécutions doivent être sérialisables (mode par défaut). Un verrouillage strict doit alors être assuré par le SGBD. SQL2 propose des options moins fortes : SET TRANSACTION ISOLATION LEVEL option Liste des options : 1. READ UNCOMMITTED : on autorise les lectures de tuples écrits par d'autres transactions mais non encore validées 2. READ COMMITED : on ne peut lire que les tuples validés (pas de verrou sur une donnée lue). C'est le mode par défaut d'oracle. 81
GRANULARITÉ DE VERROUS Dans les exemples on a verrouillé des tuples Une table peut contenir des millions de tuples 2-PL peut alors conduire à la gestion de millions de verrous Est-ce la solution la plus performante? Pas toujours
GRANULARITÉ DE VERROUS attribut tuple page table définie par un predicat table de base base de données impossible d'inserer/supprimer MAJ un tuple d'une page ou table ou base vérouillée
GRANULARITÉ DE VERROUS Granularité fine offre + de concurrence Mais aussi plus délicats à gérer tables de verrous + grandes + de possibilités de verrou mortel En pratique en général on verrouille tuples pages Elargissement d'un verrou (lock escalation) : un verrou fin est remplacé par un verrou moins fin tuple -> table
NIVEAUX D'ISOLATION Sérialisabilité totale coûte cher N'est pas nécessaires pour toutes transactions Les SGBD et SQL-3 offrent dès lors différents niveaux d'isolation de transactions à utiliser avec des précautions
NIVEAUX D'ISOLATION dégrée de concurrence R-Uncommitted (dirty reads) R-Committed (cursor stability) Longs W-locks de tuples N.A (R-only) Longs R-locks de tuples N Longs R et W-locks de predicats N O N N R- Repeatable O O N Serializable O O O Les locks courts (short-term locks), latches, sont lâchés tout-de-suite Les locks longs sont maintenus jusqu'à la fin de la transaction
READ UNCOMMITTED exec sql set transaction read uncommitted En SQL-3, une telle transaction est par défaut Read Only pour prévenir les MAJs perdues les Write ne sont possibles que par une transaction de niveau R-Committed au moins une telle transaction est par défaut Read Write sauf une déclaration Read Only dans l'ordre Set Transaction fausses valeurs de fonctions agrégat. sont possibles valeurs erronées dérivées de celles non-commises peuvent se propager entre les transactions
READ COMMITTED exec sql set transaction read committed Seules les valeurs commises sont lues en utilisent R-latches de tuples Les écritures utilisent W-locks de tuples Les lectures successives d'une donnée positionnée par le curseur lisent toujours une même valeur d'où le nom cursor stability Un retour du curseur sur une donnée dans une même transaction peut par contre lire une valeur différente Il n'y a pas de MAJ perdues sauf si on le veut profondément Le calcul d'une fonction agrégat peut être erronée
READ REPEATABLE exec sql set transaction read repeatable On utilise R-locks et W-locks de tuples Les lectures d'une donnée peuvent être répétées dans une transaction Une fonction agrégat peut-être correctement évaluée Pas de MAJ perdues