|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : septembre 2006 Messages : 87 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : février 2006 Messages : 3 433 ![]() |
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é. |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : septembre 2006 Messages : 87 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com