diff --git a/BDD2_TPS2.sql b/BDD2_TPS2.sql new file mode 100644 index 0000000..c96d924 --- /dev/null +++ b/BDD2_TPS2.sql @@ -0,0 +1,125 @@ +select distinct sid from v$mystat ; +//1256 + +CREATE TABLE Donnees_HuRa ( + nom VARCHAR2(5), + valeur NUMBER +); + +INSERT INTO Donnees_HuRa (nom, valeur) VALUES ('A', 0); +INSERT INTO Donnees_HuRa (nom, valeur) VALUES ('B', 0); +INSERT INTO Donnees_HuRa (nom, valeur) VALUES ('C', 0); + +COMMIT; + +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +UPDATE Donnees_HuRa +SET valeur = valeur + 1 +WHERE nom = 'A'; + +SELECT nom, valeur +FROM Donnees_HuRa +WHERE nom = 'A' +FOR UPDATE; + + + +//1/ + +//1) +//WAITING_SESSION HOLDING_SESSION LOCK_TYPE MODE_HELD MODE_REQUESTED LOCK_ID1 LOCK_ID2 +//--------------- --------------- -------------------------- ---------------------------------------- ---------------------------------------- ---------- ---------- +// 1281 1256 Transaction Exclusive Exclusive 131073 406793 +// 1244 1260 Transaction Exclusive Exclusive 262146 509268 +// 1270 1277 Transaction Exclusive Exclusive 720904 692919 + +//2) + +//holding et waiting session : les session concernée par l'action + +//3) +//oui + +//2/ + +//1) +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'A'; +COMMIT; + +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +//le phénomène mis en évidence est de lecture non répétable + +//2) + +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'A'; + +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'B'; + +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'B'; + +//t1 : les valeurs de A et B sont 3 et 0 +//t2 : problème avec l'update, elle attends que user 2 libère le tableau, pour mettre à jour : deadlock +//la startégie utiliser par oracle, consiste à détecter les deadlock, puis annule une des transactions, et libère les verroux + +//3) + +SELECT nom, valeur +FROM Donnees_HuRa +WHERE nom = 'A' +FOR UPDATE; + +UPDATE Donnees_HuRa +SET valeur = valeur+1 +WHERE nom = 'A'; +COMMIT; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +//t1 : la valeur C à été mis à jour +//t2 : la commande subit un deadlock, dû au select for update + +//3/ +//1) +SET TRANSACTION READ ONLY; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + + +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + + +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; +COMMIT; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +//t1 : A = 0 +//t2 : A = 0 +//t3 : A = 0 +//t4 : A = 2 +//Il y a que deux représentations de A + +//2) + +SET TRANSACTION READ ONLY; + +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; +COMMIT; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +//Car la session n'as pas fait de commit + +//4/ + + + + + + + diff --git a/user2.sql b/user2.sql new file mode 100644 index 0000000..3bebae4 --- /dev/null +++ b/user2.sql @@ -0,0 +1,74 @@ +select distinct sid from v$mystat ; //1281 + +UPDATE Donnees_HuRa +SET valeur = valeur + 1 +WHERE nom = 'A'; + +//2/ + +//1) +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'A'; + +COMMIT; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +//2) + +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'B'; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'B'; + +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'A'; + +//3) + +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'C'; + +UPDATE Donnees_HuRa +SET valeur = valeur +1 +WHERE nom = 'A'; + +COMMIT; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'C'; + +//3/ + +//1) +UPDATE Donnees_HuRa +SET valeur = valeur+1 +WHERE nom = 'A'; +COMMIT; + + +UPDATE Donnees_HuRa +SET valeur = valeur+1 +WHERE nom = 'A'; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; +COMMIT; + +//2) + +UPDATE Donnees_HuRa +SET valeur = valeur+1 +WHERE nom = 'A'; +SELECT nom, valeur FROM Donnees_HuRa WHERE nom = 'A'; + +COMMIT; + + + + +