Oracle : Transactions et concurrence d`accès
Transcription
Oracle : Transactions et concurrence d`accès
Oracle : Transactions et concurrence d'accès Objectifs : ➢ Comprendre le fonctionnement des transactions dans Oracle ➢ Comprendre l'interblocage dans Oracle ➢ Comprendre le fonctionnement du mode SERIALIZABLE dans Oracle Démarrer la machine virtuelle, puis charger le TP « 6 : Transactions et concurrence d’accès » Transactions Ce TP permet d’observer la concurrence d’accès, vous devrez donc ouvrir simultanément plusieurs connexions, pour simuler la connexion de deux utilisateurs. Toutes les connexions doivent être faites avec le compte transaction@di. Pour ouvrir deux connexions, ouvrez donc deux terminaux, puis ouvrez une connexion dans chacun ; du point de vue d’Oracle, cela correspond à deux connexions distinctes. 1. Dans la première fenêtre exécuter successivement : SELECT * FROM chiffres WHERE num_val=1; UPDATE chiffres SET text_val='douze' WHERE num_val=1; SELECT * FROM chiffres WHERE num_val=1; Dans la seconde fenêtre exécuter : SELECT * FROM chiffres WHERE num_val=1; D'un point de vu théorique, la séquence d'exécution correspondant aux commandes saisies est donc : r1(chiffres1)w1(chiffres1)r1(chiffres1)r2(chiffres1) a. Le verrouillage à deux phases (tel qu'étudié en cours) autorise-t-il cette exécution ? b. Quelle est la différence avec le fonctionnement observé ? c. Dans la première fenêtre exécuter l'instruction COMMIT, puis afficher le contenu de chiffres (SELECT *...) dans chacune des fenêtres. Que constatez vous ? Pourquoi ? 2. Exécuter un COMMIT dans chaque fenêtre, puis exécuter dans l'ordre : a. Connexion 1 : DELETE FROM chiffres WHERE num_val=0; b. Connexion 1 : DELETE FROM chiffres WHERE num_val=1; c. Connexion 1 & 2 : SELECT * FROM chiffres; d. Connexion 1 : ROLLBACK; e. Connexion 1 : SELECT * FROM chiffres; Observer les données de la table chiffres à chaque étape et commenter ce que vous trouvez. En particulier, rappeler le rôle de ROLLBACK. 3. Exécuter un ROLLBACK dans chaque fenêtre, puis exécuter dans l'ordre : a. Connexion 1 :UPDATE chiffres SET text_val='modifié par T1' WHERE num_val=5; b. Connexion 2 :UPDATE chiffres SET text_val='modifié par T2' WHERE num_val=6; c. Connexion 1 & 2 : SELECT * FROM chiffres; d. Connexion 2 :UPDATE chiffres SET text_val='modifié par T2' WHERE num_val=5; e. Connexion 1 :ROLLBACK; f. Connexion 1 & 2 : SELECT * FROM chiffres; g. Connexion 2 :ROLLBACK; Que se passe-t-il ? Pourquoi ? 4. Refaire les mêmes exécutions que pour la question précédente, mais au point e. exécuter la requête UPDATE chiffres SET text_val='modifié par T1' WHERE num_val=6; Que se passe-t-il ? Est ce qu’une transaction est annulée ? Niveaux d'isolation Ouvrez deux connexions SqlPlus. Lors de la préparation du TP une table games a été créée, dont le contenu est le suivant : CODEG NOMG PRIX ---------- -------------------- ---------1 Warcraft 3 100 2 Fifa 2005 150 3 The Sims 200 Pour ce TP, plusieurs scripts ont été créés. Ils permettent de lire et d'écrire dans cette table : • r : Lecture des 3 enregistrements. • war3 : Écriture sur l'enregistrement 1. • fifa : Écriture sur l'enregistrement 2. • sims : Écriture sur l'enregistrement 3. Ces scripts SQL se trouvent dans /home/oracle/Bureau/games. Dans ce TP lorsque vous devez exécuter des opérations, vous devez utiliser ces scripts. Par exemple, l'opération r1 ou (r2) consiste à exécuter la commande @/home/oracle/Bureau/games/r dans la connexion 1, l'opération w2[sims] la commande @/home/oracle/Bureau/games/sims. Le script annule permet de rétablir la table games a son état initial, et sera utilisé régulièrement. 1. Pour chacune des exécutions suivantes, vérifier le fonctionnement et noter les différences par rapport aux règles étudiées en cours du verrouillage à deux phases. Après chaque exécution, penser à faire les rollback/commit et à utiliser systématiquement le script annule pour revenir à la situation initiale. a. r1 r2 w1[Fifa] r2 w1[War] r2 R1 r2 R2 b. r1 r2 w1[Fifa] r2 C1 r2 w1[Fifa] r2 C1 r2 R2 c. r1 r2 w1[Fifa] w2[war] r1 r2 C1 C2 r1 r2 R1 R2 d. r1 r2 w1[Fifa] w2[War] r1 r2 w1[Sims] w2[Sims] r1 r2 C1 C2 r1 r2 e. r1 r2 w1[Fifa] w2[War] r1 r2 w2[Fifa] w1[War] r1 r2 R1 R2 r1 r2 f. r1 r2 w1[War] C1 r2 w2[War] r2 C2 2. Reprenez l'exécution 1.a, mais en utilisant le script r2 à la place de r. Ce script utilise pour la sélection la requête SELECT * FROM games FOR UPDATE. Quelles sont les conséquences pour chacune des exécutions vues en 1 ? Quel est l’intérêt de la clause FOR UPDATE, quand faut-il l’utiliser ? 3. Exécuter la commande ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE dans chacune des connexions. Cette commande place les connexions à un niveau d'isolation dit sérialisable. a. Reprenez des exécutions de la question 1, et observer le comportement d'Oracle avec ce niveau d'isolation. b. Expliquer l'erreur constatée lors de l'exécution f. Grégory Fonlupt - Oracle : Transactions et concurrence d'accès - 2/2