Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Débuter
Débuter Forum d'entraide pour débuter avec Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2010, 17h34   #1
Membre du Club
 
Inscription : mars 2003
Messages : 114
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 114
Points : 48
Points : 48
Par défaut Oracle et les transactions

Bonjour,

Je ne comprends pas comment fonctionne les transactions en Oracle.
D'après les essai que j'ai fait, les transactions ne sont pas bloquants, contrairement à MySQL.

Par exemple, si j'ai 2 sessions qui font :
n=select max (id) from matable;
n=n+1;
insert into matable(id) values (n);
commit;

L'une des sessions va fonctionner, et l'autre va planter en indiquant qu'il y a un problème d'unicité sur la clef primaire.
Même en mettant le niveau d'isolation serializable, l'une des deux va planter.

N'y a t il pas un moyen de bloquer une des deux sessions au select pour qu'il attende que la 2eme session finisse son travaille ?
tulipebleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2010, 19h56   #2
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 261
Points : 3 261
Sous Oracle, le comportement par défaut de verrouillage, et d'isolation des transactions, a les caractéristiques suivantes :
- les verrous portent uniquement sur les lignes modifiées (par INSERT, UPDATE ou DELETE). Les lignes non concernées ne subissent aucun verrou.
- les SELECT ne provoquent aucun verrou
- le fait qu'une ligne soit verrouillée à cause d'une modification non encore validée n'empêche pas qu'une autre session puisse lire cette même ligne ; seulement elle verra les valeurs en vigueur avant la modification (qui sont récupérées à partir des segments d'annulation).
- une session S1 ne peut voir les effets d'une transaction effectuée par une session S2 qu'une fois que S2 aura validé sa transaction par COMMIT
- les verrous sont libérés à la fin de la transaction (COMMIT ou ROLLBACK)

Autrement dit, la seule situation qui provoque un blocage, c'est lorsque 2 sessions tentent de modifier simultanément une même ligne.

Compte tenu de tout ça, votre situation est normale :
Disons que la session S1 réussit à insérer 11 à la ligne 100 (choisie au hasard), qui devient donc verrouillée, mais le COMMIT n'a pas encore eu lieu.
S2 ne peut voir que les valeurs validées, et récupère donc 10, l'incrémente à 11, et réussit à l'insérer à la ligne 101 (choisie au hasard), qui devient donc verrouillée sans souci puisqu'il ne s'agit pas de la même ligne. Par contre à la vérification de la contrainte d'unicité, ça ne passe pas !

Dans votre cas, la bonne solution est d'utiliser une séquence, ce qui aura 2 avantages : ça sera nettement plus performant que de faire un SELECT MAX dans la table, et ça vous garantira des identifiants uniques.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 29/12/2010, 16h36   #3
Membre du Club
 
Inscription : mars 2003
Messages : 114
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 114
Points : 48
Points : 48
Merci, c'est très clair.
tulipebleu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h52.


 
 
 
 
Partenaires

Hébergement Web