LO14 : Université Technologique <strong>de</strong> Troyes4.4 Le protocole à <strong>de</strong>ux phasesS'il est aisé <strong>de</strong> savoir quand poser <strong>les</strong> verrous, la levée <strong>de</strong>s verrous est beaucoup plus délicate. En effetd'autres précautions sont encore à prendre. Si on tente d'augmenter le ren<strong>de</strong>ment du traitement simultané<strong>de</strong>s transactions en déverrouillant <strong>les</strong> données dés que possible, la base peut se trouver en étatinconsistant. Si on ne déverrouille pas un article avant d'en verrouiller un autre, on crée <strong>de</strong>s interblocages. Ilfaut donc imposer aux transactions un protocole <strong>de</strong> déverrouillage. Le plus fréquent est le protocole <strong>de</strong>verrouillage à <strong>de</strong>ux phases, qui garantit la sérialisabilité <strong>de</strong> l'exécution <strong>de</strong>s transactions. Ce protocoleimplique que chacune <strong>de</strong>s transactions émette ses <strong>de</strong>man<strong>de</strong>s <strong>de</strong> verrouillage et <strong>de</strong> déverrouillage en <strong>de</strong>uxphases distinctes :• Verrouillage croissant. La transaction peut obtenir <strong>de</strong> nouveaux verrouillages mais pas <strong>de</strong> nouveauxdéverrouillages• Verrouillage décroissant. La transaction peut obtenir <strong>de</strong>s déverrouillages mais pas <strong>de</strong> nouveauxverrouillages.Initialement une transaction est en phase <strong>de</strong> verrouillage croissant. Lorsqu'elle libère un verrou, elle entreen phase <strong>de</strong> décroissance et aucun verrouillage ne peut plus être <strong>de</strong>mandé.Définition : Une transaction est dite à <strong>de</strong>ux phases si elle n'exécute aucun LOCK après avoir exécuté unUNLOCK.Voici <strong>les</strong> <strong>de</strong>ux transactions T1 et T3 précé<strong>de</strong>ntes transformées pour être compatib<strong>les</strong> avec le protocole <strong>de</strong>verrouillage à <strong>de</strong>ux phases.T1'lockX(B)x=read(B)x=x10write(B,x)lockX(A)t=read(A)t=t+10write(A,t)unlock(B)unlock(A)T3'lockS(A)y=read(A)lockS(C)z=read( C)display(y+z)unlock(A)unlock( C)Bien que ce verrouillage à <strong>de</strong>ux phases as<strong>sur</strong>e la sérialisabilité il n'évite pas pour autant <strong>les</strong> interblocages. Ilse peut en effet que plusieurs transactions s'atten<strong>de</strong>nt mutuellement. C'est le cas avec la transaction à <strong>de</strong>uxphases T4 qui fonctionne comme T3' (lui-même transformation <strong>de</strong>ux phases <strong>de</strong> T3) mais <strong>sur</strong> la donnée B àla place <strong>de</strong> la donnée C.T1'lockX(B)x=read(B)x=x10write(B,x)lockX(A)t=read(A)t=t+10write(A,t)unlock(B)unlock(A)T4lockS(A)y=read(A)lockS(B)z=read(B)display(y+z)unlock(A)unlock(B)Avec ces <strong>de</strong>ux transactions à <strong>de</strong>ux phases, <strong>de</strong>s interblocages peuvent se produire. Il y a interblocage siplusieurs transactions s'atten<strong>de</strong>nt mutuellement pour accé<strong>de</strong>r aux données. En voici un exemple :70 /98 S. Moutou : Cours
LO14 : Université Technologique <strong>de</strong> TroyesT1''lockX(B)x=read(B)x=x10write(B,x)lockX(A).....T4lockS(A)y=read(A)lockS(B)....Il existe plusieurs manières d'éviter <strong>les</strong> verrous mortels :• Obliger <strong>les</strong> transactions à <strong>de</strong>man<strong>de</strong>r tous <strong>les</strong> verrous simultanément. Le système <strong>les</strong> accepte alors tousà la fois ou aucun. Des données peuvent donc être verrouillées longtemps sans être utilisées.• Fixer une relation d'ordre <strong>sur</strong> <strong>les</strong> données et obliger <strong>les</strong> transactions à <strong>de</strong>man<strong>de</strong>r leurs verrous dans cetordre.• Quand une situation d'interblocage se produit, arrêter la transactions incriminée et la réexécuterultérieurement. Pour cela on affecte à chaque transaction une estampille unique et on utilise cesestampil<strong>les</strong> pour déci<strong>de</strong>r si en cas <strong>de</strong> conflit, une transaction doit être mise en attente ou rejetée. Si elleest rejetée elle reste affectée à la même estampille, ce qui la fait "vieillir''. Deux schémas existent pourrégler <strong>les</strong> conflits entre transactions plus jeunes et plus vieil<strong>les</strong> : WaitDie et WoundWait.1. Avec le schéma WaitDie (attendre ou mourir), si une transaction Ta détient unedonnée et que Tb la réclame dans un mo<strong>de</strong> non compatible, on autorise Tb à attendressi Tb est plus vieille que Ta. Dans le cas contraire, Tb est avortée, elle sera relancéeavec la même estampille. Donc plus Tb vieillit plus elle est autorisée à attendre.2. Avec le schéma préemptif WoundWait (B<strong>les</strong>ser ou attendre) si une transaction Tadétient une donnée et que Tb la réclame dans un mo<strong>de</strong> non compatible, on autorise Tbà attendre si elle est plus jeune que Ta. Dans le cas contraire, Ta est b<strong>les</strong>sée (avortéeet relancée avec la même estampille). Donc plus Tb est vieille plus elle est autorisée àaccé<strong>de</strong>r aux données.Que ce soit dans le schéma WaitDie ou dans le schéma Woundwait, la plus vieille <strong>de</strong>s transactions nepeut être rejetée. Ces <strong>de</strong>ux schémas évitent <strong>les</strong> situations <strong>de</strong> <strong>de</strong>adlock.Prenons l'exemple <strong>de</strong> 3 transactions Ta, Tb et Tc d'estampil<strong>les</strong> respectives 5,10 et 15.1. WaitDie :Si Ta réclame un article traité par Tb, Ta attend.Si Tc réclame un article traité par Tb, Tc est rejetée.2. WoundWait :Si Ta réclame un article traité par Tb, Tb est rejetée et Ta prend la donnée.Si Tc réclame un article traité par Tb, Tc attend.Selon <strong>les</strong> types d'applications gérées par l'entreprise, on préférera soit le schéma par estampillage <strong>de</strong> typeWoundWait (c'est le cas pour le contrôle <strong>de</strong> processus ou la gestion bancaire) soit le schéma WaitDie.Pour prendre en compte l'ordonnancement <strong>de</strong>s transactions, la gestion <strong>de</strong>s fi<strong>les</strong> d'attentes entretransactions, la pose et la levée <strong>de</strong>s verrous il faut un outil spécial : Le moniteur transactionnel. Le plusconnu est sans doute CICS fourni par IBM pour <strong>systèmes</strong> MVS.C'est aussi à lui <strong>de</strong> vérifier et <strong>de</strong> gérer <strong>les</strong> points suivants :• Quand une transaction ne peut pas accé<strong>de</strong>r à une donnée à cause d'un verrou, elle est mise en attente.Dés que la transaction concurrente libère <strong>les</strong> verrous, elle se remet en exécution.• Si une transaction est en attente <strong>de</strong>puis une durée supérieure à une durée limite, la transaction estrejetée.• Si plusieurs transactions s'atten<strong>de</strong>nt mutuellement (<strong>de</strong>adlock), le système choisit une transaction quisera rejetée.Pour conclure ce chapitre il est important <strong>de</strong> dire que la manière dont le journal, <strong>les</strong> verrous etl'ordonnancement <strong>de</strong>s transactions sont effectués restent transparents pour l'utilisateur. Tout se passecomme si l'utilisateur était seul avec sa base <strong>de</strong> données. Néanmoins la compréhension <strong>de</strong>s mécanismesprofonds permettant l'accès concurrent est important pour écrire <strong>de</strong>s transactions efficaces. On prendragar<strong>de</strong> notamment et autant que faire se peut à• grouper <strong>les</strong> lectures ensemb<strong>les</strong> et <strong>les</strong> écritures ensemb<strong>les</strong> dans la transaction, ou mieux, dans <strong>de</strong>stransactions séparées.• éviter <strong>de</strong>s traitements longs entre <strong>les</strong> lectures et <strong>les</strong> écritures.• regrouper <strong>les</strong> interventions <strong>de</strong> l'opérateur en début <strong>de</strong> transaction et <strong>les</strong> lecturesécritures en fin <strong>de</strong>transaction.71 /98 S. Moutou : Cours