Beruflich Dokumente
Kultur Dokumente
Conformément `a la norme SQL2, on peut définir le mode (lecture seule ou lecture écriture) d’une
transaction par l’instruction :
SET TRANSACTION { READ ONLY | READ WRITE };
Il est également possible de spécifier le niveau d’isolation d’une transaction :
SET TRANSACTION ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED };
Par défaut, le mode d’une transaction est READ WRITE et son niveau d’isolation est READ
COMMITTED.
Dans la suite, nous allons déterminer expérimentalement la signification des déférents modes et
niveaux d’isolation et voir que leurs valeurs par défaut ne garantissent pas la sérialisabilité des
transactions.
Partie 1
Pour ce TP il faut ouvrir deux connexions, avec deux utilisateurs Xuser et Yuser
ayant tous les droits
Dans les tableaux un couple (SCN, valeur) est une valeur de ligne et correspond à :
Remarquez qu’une ligne dont toutes les versions sont en gras est
verrouillée. C’est le cas des lignes qui viennent d’être insérées, la transaction
possédant le verrou est soulignée.
Effet du rollback
Et maintenant un interblocage.
Q.12 Quelle est la transaction dont l’instruction a échoué par interblocage, et celle
dont l’instruction est toujours bloquée ? Faites un rollback de la transaction dont
l’instruction a échoué.
Suppression de ligne
droi set transaction isolation level serializable ; -- SCN = 10
te delete from T where x = 25 ;
select * from T ;
Tr.
10
État table T segment de recouvrement
15 SCN (valeur) SCN (valeur) SCN (valeur) SCN (valeur)
Transactions 8 (11) 1 (1)
actives : 10 (+) 6 (25) 4 (22) 1 (2)
(10) 8 (333) 1 (3)
gauche Tr. 11 set transaction isolation level serializable ;
-- SCN = 11
insert into T values (421) ;
select * from T ;
update T set x = 255 where x = 25 ;
État 16 table T segment de recouvrement
SCN SCN SCN SCN
(valeur) (valeur) (valeur) (valeur)
Transacti
8 (11) 1 (1)
ons
actives : 10 (+) 6 (25) 4 (22) 1 (2)
(10, 11) 8 (333) 1 (3)
11 (421)
Q.16 Qu’arrive-t-il à gauche et combien de lignes sont modifiées par son update ?
Et pourquoi la ligne détruite est-elle toujours là ?
Partie 2
il faut alors ouvrir deux connexions. Les manipulations qui suivent utiliseront une table T ayant 2
colonnes numériques A et B. On utilisera les abréviations suivantes :
– select T pour select * from T ;
– T(A=1) pour select * from T where A=1 ;
– insert (3,6) pour insert into T values (3,6) ;
– update(A<-A+1) pour update T set A=A+1 ;
– update(A<-3)|(A=4) pour update T set A=3 where A=4 ;
– delete(A=4) pour delete from T where A=4.
Commencez par créer la table T ayant 2 colonnes num´eriques A et B.
Avec Oracle, il existe une clause for update `a l’instruction select. L’expérience suivante va vous
permettre de comprendre son utilité
.
Partie 3
Script de la base
- Description : Création des tables pour la base "Bibliothèque"
--
-- +----------------------------------------------------------------------------------------------------------------+
-- | Création utilisateur, autorisations, connexion |
-- +----------------------------------------------------------------------------------------------------------------+
-- +----------------------------------------------------------------------------------------------------------------+
-- | Destruction des tables 'lecteur', 'livre' |
-- +----------------------------------------------------------------------------------------------------------------+
-- Attention a l'ordre dans lequel les drop sont effectues. Il faut que les tables
-- contenant des cles etrangeres sur d'autres tables soient dropees avant celles-ci
drop table livre;
drop table lecteur;
-- +----------------------------------------------------------------------------------------------------------------+
-- | Création des tables 'lecteur', 'livre' |
-- +----------------------------------------------------------------------------------------------------------------+
create sequence num_livre_seq;
create sequence num_lecteur_seq;
-- +----------------------------------------------------------------------------------------------------------------+
-- | Création des procédures PLSQL d'insertion dans les tables |
-- +----------------------------------------------------------------------------------------------------------------+
-- +----------------------------------------------------------------------------------------------------------------+
-- | Insertion de données |
-- +----------------------------------------------------------------------------------------------------------------+
exec inserer_lecteur('Picouet');
exec inserer_lecteur('Tanguy');
exec inserer_lecteur('Segarra');
commit;
-- +----------------------------------------------------------------------------------------------------------------+
-- | SALUT ! |
-- +----------------------------------------------------------------------------------------------------------------+
LES TABLES
La table Livre contient des informations sur les différents livres de la bibliothèque, ainsi que la référence du
lecteur qui l’a emprunté. La table Lecteur contient des informations sur les lecteurs inscrits à la bibliothèque.
Pour voir le contenu de ces deux tables, tapez la commande suivante dans l’interpréteur SQL (attention à ne
pas oublier le « ; » à la fin de la commande) : select * from nom_table ;
Pour voir la structure de ces deux tables tapez la commande : desc nom_table ;
B. LES VUES
Les vues vous permettent d’accéder plus simplement à certaines informations. Pour interroger une vue utiliser
la commander : select * from nom_vue
Vous avez à votre disposition deux vues :
infos : affichant les numéros de livre et les numéros de leurs emprunteurs
infos_livre : affichant toutes les informations détaillées sur les livres
Pour observer la structure des vues, utilisez les mêmes commandes que pour les tables.
C. LES PROCEDURES STOCKEES
Les procédures stockées permettent d’effectuer des requêtes prédéfinies lors de la création de la base. Pour
effectuer ce TP un certain nombre de procédures vous sont fournies, prenez le temps tout au long des
exercices de les lire. Pour exécuter une procédure stockée utilisez la commande suivante :
exec nom_procedure(attribut1, … , attributn)
Vous disposez des procédures stockées suivantes (lors de l’appel n’indiquez pas le typage !) :
varchar nom , varchar titre ,varchar collection, int ref)
int numlivre)
varchar nom)
int numlivre, int numlecteur)
int numlivre)
Ouvrez le fichier de script de création de la base de données afin de lire le code des procédures lorsque vous
les utilisez lors de cet exercice.
Ouvrez deux sessions afin d’accéder à votre base de données en simulant plusieurs utilisateurs.
1. VALIDATION D’UNE TRANSACTION
1. Dans la session A, observez l’état des relations en utilisant la vue infos. Ajoutez ensuite un nouveau
lecteur et un nouvel emprunt à la base en utilisant les procédures stockées inserer_lecteur et emprunter.
2. Interrogez les relations dans la session B en utilisant la vue infos. Que constatez-vous ?
3. Dans la session A, validez la mise à jour avec la commande « commit ; ».
4. Que constatez-vous dans la session B ?
5. Pour rétablir l’état d’origine, rendre le livre emprunté dans la session A, validez avec la commande «
commit ; »