TP8 - Gestion Transactionnelle MIAGE #3-2006/2007 November 29, 2006 1 Transactions sous Oracle Il est nécéssaire pour ce T.P. de travailler par binômes connectés simultanement (sous SQL*PLUS) sur deux machines voisines. Les manipulations qui suivent attaqueront une table Donnees(nom char(5), valeur number(3)). Vous devez donc créer cette table, et la rendre accessible (tout privilège) aux deux expérimentateurs 1. Vous initierez cette table de façon à ce qu elle contienne les tuples: (A, 0), (B,0), (C, 0). Par la suite, lorsqu on écrira:, il faut comprendre select nom, valeur from donnees where nom= A ;, il faut comprendre update donnees set valeur = valeur +1 where nom = A. Avousdecréer les scripts sql appropriés. Réaliser les manipulations suivantes et surtout analyser leur comportement. Avant chaque nouvelle manipulation, on terminera les transactions en cours (si ce n est pas fait) dans chaque des sessions. 1.1 Transactions Standards 1.1.1 Manip. 1à moins que les deux expérimentateurs se connectent sous le même nom de user Oracle 1
Montrer que cet exemple suffit à montrer qu en mode standard, les transactions sous øne sont pas (toujours) sérialisables. 1.1.2 Manip. select B select B Commentez les situations aux instants t 1 et t 2. 1.1.3 Manip. for update update C(+1) -- Commentez les situations aux instants t 1 et t 2. 1.2 Transaction Read Only (ne pas traîter) 1.2.1 Manip. set transaction read only 2
t -- A l instant t combien de valeurs de A sont présentes dans le système, àquoi correspondent-elles? 1.3 Verrouillage Explicite 1.3.1 Manip. lock table donnees in share mode select B for update select B -- Comment expliquez-vous ce qui s est passé auxinstantst 1,t 2? 1.3.2 Manip. lock table donnees in exclusive mode for update Comment expliquez-vous ce qui s est passé auxinstantst 1 et t 2? 1.3.3 Manip. lock table donnees in share mode lock table donnees in share mode Comment expliquez-vous ce qui s est passé auxinstantst 1 et t 2? 3
1.3.4 Manip. Au travers d une form ADF Développer une form (dans le cadre ADF) réalisant un interfacage graphique de la table haras. Lancer (sur un même poste, ou sur des postes différents) deux executions de celle-ci. Observez et reportez ce qu il se passe lorsque : - on modifie dans l une et l autre des lignes distinctes - on modifie dans l une et l autre les mêmes lignes et que l on effectue des opérations de, rollback. 2 Capture de l exception deadlock Créer la procedure suivante qui a pour effet de verrouiller une ligne donnée de la table donnees et qui intercepte l exception levéelorsquelesystème détecte et corrige un deadlock. create or replace procedure lock_ligne(x char) is deadlock exception ; pragma exception_init(deadlock, -00060); begin update donnees set valeur=valeur+1 where nom = x ; exception when deadlock then dbms_output.put_line( detection deadlock ); when others then dbms_output.put_line( autres ); end Soit l ordonnancement transactionnel suivant : T1 T2 --------------------------------------+------------------------------------- t0 select * from donnes select * from donnes; lock_ligne( A ) lock_ligne( B ) lock_ligne( B ) lock_ligne( A ) select * from donnees ; select * from donnees ; ; Question 1 Expliquer le résultat des select en t 0,t 1,t 2, dire en quoi cette expérience démontre que l action entreprise par le système lors de la détection d un deadlock est bien différente d un rollback. 4
3 Simulation Exclusion Mutuelle On souhaite exploiter le verrou exclusif détenu par une transaction sur les lignes qu elle met à jour pour simuler un mécanisme d exlusion mutuelle. Ainsi, on constituera une table pieces(idpiece number,...) dont les lignes correspondront à un lot de pièces devant subir divers traitements. On supposera qu une pièce ne peut subir à un même moment qu un seul traitement (exclusion mutuelle/ processus effectuant les traitements). Chaque traitement de pièce s effectuera selon une certaine durée qui pourra être fixe ou aléatoire 2 Ainsi d un traitement λ de durée d sur la pièce d identifiant x s apparentera à la transaction suivante: -- verrouillage de la "pièce" par la transaction (traitement) update piece set.. =... where idpiece = x; dbms_lock.sleep(d); -- libération de la "pièce" ; Afin de suivre la sequence d événements (traitements d une pièce), on met en place une table trace(heure 3, traitement, piece, duree) dans laquelle on mémorisera, au fur et àmesuredeleurdéclenchement, les differents traitements que subissent les pièces. Question 2 Ecrire une procédure stockée appliquertraitementdf(nomtraitement varchar2, df number) qui fait subir le traitement nomtraitement de durée fixe df àtouteslespièces. Question 3 Ecrire une procédure stockée appliquertraitementda(nomtraitement varchar2, dmax number) qui fait subir le traitement nomtraitement de durée aléaloire limitée à dmax à toutes les pièces. Question 4 Tester seule chacune de ces procédures. Comparer en exploitant les traces, la durée totale du traitement (entre le début du traitement de la première pièce et la fin du traitement de la dernière) et le temps effectif de traitement (somme des durées de chacun des traitements élémentaires de pièce). Ouvrez deux sessions sous le même compte (concurrentes) d Oracle (par exemple sous Sql/Plus depuis vos deux postes). Lancer au même moment depuis ces deux sessions des appels de procédures appliquertraitement[df/af](). On pourra traîter les questions suivantes 2 dbms random.value renvoit un nombre alétoire compris entre 0 et 1; dbms lock.sleep(n) provoque une temporisation de n secondes. 3 l heure peut être obtenue à partir de la variable d environnement sysdate, en ne retenant que les informations concernant l heure. Revoir les fonctions de date sous Oracle 5
sur plusieurs expériences de ce type. Question 5 Vérifier sur la trace qu il n y a pas eu de traitements simultanés sur la même pièce. Constater sur la trace qu il peut y avoir des traitements concurrents au même moment sur des pièces distinctes. Question 6 Comparer en exploitant les traces, la durée totale des 2 traitements parallèles (entre le début du traitement de la première pièce et la fin du traitement de la dernière) et le temps effectif de ces 2 traitements (somme des durées de chacun des traitements sur chacune des pièce). Que déduire de la comparaison de ces deux valeurs? 6