Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 05/02/2007, 16h15   #1
Membre du Club
 
Inscription : septembre 2006
Messages : 87
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 87
Points : 46
Points : 46
Par défaut problème de section critique

bonjour,
je dois développer une procédure stockée en PL/SQL qui doit regarder dans les données d'une vue matérialisée, et en deux selects concécutifs, trouver un enregistrement qui statisfait un certain critère et le marquer comme trouvé.

le shéma est en gros

select a into b from anyview where anycol4 != anyval;
select c into D from anyview where anycol2 = b;
update anytable set anycol2=1 where anycol4 = D;

avec anytable est la table à partir de la quelle la vue anyview a été construite.

mon problème, est que quand j'ai deux utilisateurs concecutifs, il arrive que je reçois en sortie la même valeur D, alors que ce n'est pas possible.

je ne comprend pas très bien les différents mode de lock table ou lock view. j'utilise le mode exclusive, mais il me génère rappidement un timeout.
comment puis-je éviter le problème des section critiques? comment puis-je interdire l'accès pendant les deux select et l'update aux autre utilisateurs tout en évitant de tomber dans un deadlock?

merci
AEMAG
aemag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2007, 16h30   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
En général on utilise le clause FOR UPDATE du SELECT qui pose un verrou exclusif sur toutes les lignes concernées de la requête SELECT. Ces verrous ne sont libérés qu'à la fin de la transaction qui les a obtenus par COMMIT ou ROLLBACK. Pour éviter les deadlocks, il faut au moins essayer de prendre les verrous toujours dans le même ordre.

Dans certains cas particuliers, il peut être intéressant d'utiliser le package DBMS_LOCK si le SELECT ... FOR UPDATE n'est pas adapté.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2007, 17h45   #3
Membre du Club
 
Inscription : septembre 2006
Messages : 87
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 87
Points : 46
Points : 46
bonjour,
merci pour ton aide, j'ai fini par utiliser lock table avec le mode share row exclusive , et ça a l'air de marcher
AEMAG
aemag 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 20h47.


 
 
 
 
Partenaires

Hébergement Web