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/