A/ Présentation
Transcription
A/ Présentation
Université du Havre, Licence Pro DA2I, ABD, TP4, 10/1/2008, Enseignants : Nakechbandi M, Thème : Transaction, accès concurrentiel. A/ Présentation Vous pouvez travailler seul ou par binôme en ouvrant plusieurs sessions SQL+ et en redimensionnant toutes les fenêtres afin qu'elles soient toutes visibles. Respectez scrupuleusement l'ordre des commandes indiquées, en particulier les commit et rollback. Avant et après chaque expérience, inscrivez le contenu T dans la table prévue à cet effet, vous en aurez besoin pour repartir d'une expérience précédente, et aussi pour confronter les résultats fournis par Oracle avec vos propres prévisions. Mise en place de la table R : Script à récupérer sur (http://tamlehavre.free.fr/lp_da2i/) create table R (a Number insert into R values (0, insert into R values (2, insert into R values (0, select * from R ; grant all on R to public commit ; / (5), b Number 5)); 0) ; 3) ; 1) ; ; B/ Travail à faire (Le sujet est disponible en format pdf au http://tamlehavre.free.fr/lp_da2i/) Expérience 1. R avant Expérience 1 R après session 1 T0 select * from R; insert into R values (10,20); scn (a b) (0 0) (2 3) select * from R; (0 1) session 2 T1 ; T2 select * from R; update R set A=A+1; select * from R; ALTER TABLE r MODIFY a number(6); scn (a b) commit; select * from R; select * from R; Que se passe-t-il pour le deuxième select de T2 Expérience 2. R avant Expérience 2 R après session 1 T3 ; T5 session 2 T4 ; T6 update R set A=A+1; select * from R; scn (a b) scn (a b) select * from R; delete from R where A=2; delete from R where A=1; commit; select * from R; commit; commit; select * from R; commit; Que se passe-t-il pour le deuxième delete de T4 ? pourquoi ? 1 Expérience 3. Expérience 3 R avant session 1 T7 update R set A=A+1; select * from R; scn (a b) R après session 2 T8 set transaction isolation level Serializable; insert into R values (4,5); insert into R values (33,77); select * from R; select * from R; delete from R where A=4; commit; rollback; scn (a b) Pourquoi le delete de session 2 échoue-t-il avec une erreur ? Pourquoi termine-t-on cette transaction par un rollback ? Vérifier que l'insertion dans la table R est ineffective. Expérience 4. Les interblocages R avant Expérience 4 R après session 1 T9 session 2 T10 update R set A=4 where A=3; update R set B=2 where B=3; scn (a b) scn (a b) select * from R; select * from R; update R set A=14 where A=3; update R set B=9 where B=3; rollback; commit; Pourquoi le premier update de T10 ne se bloque-t-il pas ? Pourquoi Oracle détecte-t-il un interblocage lors du second update de T9 ? Pourquoi effectue-t-on un rollback pour terminer T10 ? Expérience 5. L'instruction select dispose de la clause optionnelle for update. L'expérience suivante va vous permettre de comprendre son utilité. R avant Expérience 5 session 1 T11 ; T13 select * from R where 1=0 for update; R après session 2 T12 ; T14 ; T15 lock table R in exclusive mode; scn (a b) commit; commit; scn (a b) select * from R where B=7 for update; update R set B=10 where B=0; select * from R; update R set A=6 where A=5; update R set B=6 where B=7; commit; commit; 2 select * from R; commit; Expliquer les blocages de T12 et T14. Quelle est la granularité des verrouillages effectués par select...for update : table et/ou ligne ? Expérience 6. Le mode Read-Only R avant Expérience 6 session 1 T16 ; T19 session 2 set transaction read only; select * from R; select * scn (a b) update R commit; select * from R; select * update R commit; select * from R; select * commit; commit; R après T17 ; T18 from R; scn (a b) set A=A+1; from R; set A=A+1; from R; Quel problème est résolu ? Comment est-il résolu ? Expérience 7. Comprendre la commande lock table R avant Expérience 7 session 1 T22 ; T24 ; T26 lock table R in share mode; R après session 2 T23 ; T25 ; T27 select * from R for update; update R set A=A+1; scn (a b) commit; lock table R in exclusive mode; commit; select * from R; select * from R for update; scn (a b) commit; commit; lock table R in exclusive mode; lock table R in exclusive mode nowait; commit; commit; Y a-t-il un bug dans Oracle ? Comment expliquez-vous ces résultats ? 3