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