RecentChanges
|
FindPage
|
LikePages
|
BackLinks
View Source:
TmeTransaction
Note:
This page has been locked and cannot be edited.
!!!Tme Transactions Les objectifs: mettre en place des situations de concurrence entre transactions. Comprendre les mécanismes de contrôle de concurrence. !!Documentation * Livre ''Concepts'': [8i, chap 24|http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76965/c23cnsis.htm#2414] * Les vues du dictionnaire 8i : [v$lock|http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch380.htm#5397], [v$locked_object | http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch383.htm#46175], [user_objects | http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch2388.htm#51398], [dba_waiters | http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch2260.htm#10507], [v$session | http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch3136.htm#9225], [v$transaction | http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch3175.htm#11192], [v$session_event | http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch3139.htm#9886], [v$session_wait|http://www.infop6.jussieu.fr/oracle/doc-library/server.817/a76961/ch3142.htm#12651] !!Préparation * Lire PréparationTme, et obtenir votre login oracle * décompresser l'archive trans-etu.tgz Une BD contient un stock de produits. Pour chaque produit, on a le n°, le nom et la quantité restant en stock. * __Produit__(num, nom, reste) Depuis sqlplus, exécuter le fichier nommé ''produit.sql'' pour créer la base * SQL> @produit Chaque transaction effectue des opérations parmi les suivantes. * Lecture d'un tuple: ** L(A) : select * from Produit where num = 1; ** L(B) : select * from Produit where num = 2; ** L(C) : select * from Produit where num = 3; * Ecriture d'un tuple : ** E(A) : update Produit set reste=&1 where num = 1; ** E(B) : update Produit set reste=&1 where num = 2; ** E(C) : update Produit set reste=&1 where num = 3; ** D(A): update Produit set reste=reste*2 where num = 1 (doubler la quantité restante);L(A); * Modification du schéma d'une relation ** SR : alter table Produit modify (nom varchar2(15)); Ouvrir 2 fenêtres de terminal, juxtaposées l'une en haut à gauche de l'écran, l'autre en bas à gauche (certaines questions peuvent nécessiter d'ouvrir une troisième fenêtre) Dans __chaque__ fenêtre * cd trans-etu (aller dans le répertoire de travail) * récupérer le numéro de terminal par la commande tty * sqlplus L3''NNN''/L3''NNN''@oracle (se connecter au SGBD) * Choisir le niveau d'isolation read committed : ** SQL> alter session set isolation_level = read committed; (voir fichier isol1.sql) ** le niveau d'isolation est fixé pour toutes les transactions d'une session (= un terminal) ** il est possible de changer le niveau d'isolation uniquement en __début__ de transaction (au début de la session ou juste après un commit). Prendre connaissance de tous les fichiers sql situés dans votre répertoire de travail. !! Ex1 : Verrouillage Réaliser les expériences montrant le fonctionnement du gestionnaire de verrous. Ci-après, chaque séquence d'opérations est représentée par un tableau. L'axe horizontal représente le temps. L'opération de la colonne ''n+1'' débute __après__ l'opération de la colonne ''n''. Exécuter __T1__ dans le 1er terminal, et __T2__ dans le 2ème. !Une lecture peut-elle être bloquante ? * L1(A) ne bloque pas L2(A) | __T1__ | L(A) | | __T2__ | | L(A) * L1(A) ne bloque pas __E__2(A) | __T1__ | L(A) | | __T2__ | | E(A) !Une lecture peut-elle être bloquée ? * L2(A) non bloquée par L1(A) (voir ci-dessus) * L2(A) non bloquée par __E__1(A) | __T1__ | E(A) | | commit | | __T2__ | | L(A) | | commit La transaction T2 voit-elle l'écriture faite précédemment par T1 ? Quel est l'ordre en série équivalent à cette exécution ? Est-ce le même que l'ordre chronologique des commit, pourquoi ? !Une écriture peut-elle être bloquante ou bloquée ? E2(A) bloquée par E1(A): Vérifier que T2 est en attente d'un verrou exclusif sur A. | __T1__ | E(A) | | __T2__ | | E(A): attente Quelles requêtes sur le dictionnaire affichent les infos suivantes ? 1. la liste des tables pour lesquelles une session en attend une autre, avec les numéros des sessions concernées, le mode de verrou demandé et celui accordé. Utiliser dba_waiters, v$locked_object , v$session et user_objects. 2. la liste des estampilles (SCN) des transactions actives (ayant déjà fait au moins une écriture ) ainsi que le numéro de session correpondant , triées par nom d'utilisateur. Utiliser v$transaction et v$session (voir les attributs addr et taddr) 3. la liste des sessions et le terminal associé. Utiliser v$session. Que se passe-t-il lorsque T1 valide, lorsque T1 abandonne (rollback) ? | __T1__ | E(A) | | commit ou rollback | __T2__ | | E(A): attente | .... ! Granularité du verrouillage * Vérifier qu'E2(B) n'est pas bloquée par E1(A) Une lecture est-t-elle bloquée par une écriture SR qui modifie le __schéma__ d'une relation ? * a) Une écriture E2(A) est-ellle bloqué par SR1 ? | __T1__ | SR | | __T2__ | | E(A) attente ? * b) Une écriture SR2 est-ellle bloqué par E1(A) ? | __T1__ | E(A) | | __T2__ | | SR attente ? * Quels sont les verrous demandés avant de traiter E(A) et SR ? !Interblocage Vérifier l'interblocage suivant: | __T1__ | E(A) | E(B) | | __T2__ | E(B) | | E(A) Comment résoudre l'interblocage sans abandonner T1 ? Définir une situation d'interblocage qui implique 3 transactions (sans attente mutuelle directe entre 2 transactions). On souhaite abandonner la transaction la plus récente. Quelle requête du dictionnaire affiche la date de début des transactions actives ? Voir l'estampille ''system change number'' (SCN) d'une transaction. !!Ex2 : Sérialisation Pour cet exercice, le niveau d'isolation des sessions est ''serializable'' * SQL> alter session set isolation_level = serializable; (ou @isol2) a) La séquence suivante est-elle sérializable ? Si oui, quel est l'ordre en série équivalent? | __T1__ | L(A) | | | __ED__(A) | __T2__ | | E(A) | commit | Que se passe-t-il ? b) La séquence suivante est-elle sérializable ? Si oui, quel est l'ordre en série équivalent? | __T1__ | L(A) | | | E(A) | __T2__ | | E(A) | commit | Pourquoi cette séquence est-t-elle refusée ? c) La séquence suivante est-t-elle sérializable ? Si oui, quel est l'ordre en série équivalent? | __T1__ | L(__B__) | | | E(A) | __T2__ | | E(A) | commit | Pourquoi cette séquence est-t-elle refusée ? d) Recommencer en modifiant les niveaux d'isolation de T1 et de T2. (voir fichiers ''isol1'' et ''isol2'') Est ce possible de garantir le niveau d'exécution ''sérializable'' pour T2, lorsque T1 est au niveau ''read committed'' ? Commenter les résultats obtenus. !Doc Diverses [TmeTransactionSupplément] (suite de l'exercice sur la sérialisation) ---- LesTme, LesCours, [Accueil]