OVH Cloud OVH Cloud

Lock

3 réponses
Avatar
phil
bonjour,
J'ai une application fourni par un editeur qui fonctionne en windows 2000 et
sqlserver 200.
Lorsque les utilisateurs font des select l'application verrouille toute la
table et bloque les autres utilisateurs.
Comment puis je faire pour changer le niveau deveouillage ( verrou au niveau
ligne par exemple ).

3 réponses

Avatar
Christian Robert
Bonjour,

Les problèmes de verrous arrivent fréquement, la version 2005 permet
d'améliorer légèrement les choses avec les modes d'isolation SNAPSHOT.

Petite explication pour votre cas.

Un utilisateur qui effectue un SELECT vérouille les données des tables (au
niveau enregistrement ou page) pendant la durée d'execution. Cependant il
s'agit d'un verrou partagé, c'est à dire que plusieurs utilisateurs peuvent
faire simultanément des SELECT, de plus on ne vérouille jamais (ou presque)
la table complète.

Les problèmes de vérouillages arrivent quand vous avez un ou plusieurs
utilisateurs qui effectuent des SELECT, et un utilisateur souhaitant réaliser
une mise à jour. Les verrous partagés (des SELECT) empechent toute mise à
jour tant qu'ils existent. Donc l'update doit attendre la fin des SELECT pour
s'executer. De même si un utilisateur effectue un UPDATE, tous les lectures
(SELECT) attendre la fin de celui-ci.

Pour éviter ce genre de situation, appliquez ces quelques conseils :
- Les mises à jours doivent être courtes et ne concerner que très peu
d'enregistrements
- Les transactions, doivent elles aussi être les plus courtes possibles.
- Evitez les niveau d'isolation de transaction tel que SERIALIZABLE et
REPEATABLE_READ quand celà n'est pas nécessaire

Vous pouvez aussi comme vous l'indiquiez utiliser WITH(ROWLOCK) au niveau de
la requête pour ne vérouiller que des enregistrements. Cependant cette
méthode désactive la gestion dynamique des vérrous par SQL Server pour cette
requête et risque de générer une surcharge de travail pour le serveur,
d'autant que celui-ci sais gérer les verrous au niveau enregistrement.

D'autres solutions plus complexes existent aussi...

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"phil" a écrit :

bonjour,
J'ai une application fourni par un editeur qui fonctionne en windows 2000 et
sqlserver 200.
Lorsque les utilisateurs font des select l'application verrouille toute la
table et bloque les autres utilisateurs.
Comment puis je faire pour changer le niveau deveouillage ( verrou au niveau
ligne par exemple ).


Avatar
phil
peut on pas modifier ûn paramètre tel que le niveau d'isolation au niveau de
la base pour ne plus avoir de verrouillage table ?

"Christian Robert" a écrit :

Bonjour,

Les problèmes de verrous arrivent fréquement, la version 2005 permet
d'améliorer légèrement les choses avec les modes d'isolation SNAPSHOT.

Petite explication pour votre cas.

Un utilisateur qui effectue un SELECT vérouille les données des tables (au
niveau enregistrement ou page) pendant la durée d'execution. Cependant il
s'agit d'un verrou partagé, c'est à dire que plusieurs utilisateurs peuvent
faire simultanément des SELECT, de plus on ne vérouille jamais (ou presque)
la table complète.

Les problèmes de vérouillages arrivent quand vous avez un ou plusieurs
utilisateurs qui effectuent des SELECT, et un utilisateur souhaitant réaliser
une mise à jour. Les verrous partagés (des SELECT) empechent toute mise à
jour tant qu'ils existent. Donc l'update doit attendre la fin des SELECT pour
s'executer. De même si un utilisateur effectue un UPDATE, tous les lectures
(SELECT) attendre la fin de celui-ci.

Pour éviter ce genre de situation, appliquez ces quelques conseils :
- Les mises à jours doivent être courtes et ne concerner que très peu
d'enregistrements
- Les transactions, doivent elles aussi être les plus courtes possibles.
- Evitez les niveau d'isolation de transaction tel que SERIALIZABLE et
REPEATABLE_READ quand celà n'est pas nécessaire

Vous pouvez aussi comme vous l'indiquiez utiliser WITH(ROWLOCK) au niveau de
la requête pour ne vérouiller que des enregistrements. Cependant cette
méthode désactive la gestion dynamique des vérrous par SQL Server pour cette
requête et risque de générer une surcharge de travail pour le serveur,
d'autant que celui-ci sais gérer les verrous au niveau enregistrement.

D'autres solutions plus complexes existent aussi...

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"phil" a écrit :

> bonjour,
> J'ai une application fourni par un editeur qui fonctionne en windows 2000 et
> sqlserver 200.
> Lorsque les utilisateurs font des select l'application verrouille toute la
> table et bloque les autres utilisateurs.
> Comment puis je faire pour changer le niveau deveouillage ( verrou au niveau
> ligne par exemple ).


Avatar
Christian Robert
L'option ROWLOCK c'est uniquement au niveau de la requête (en fait de la
table pour être exact).

Les niveau d'isolation, se définissent au niveau de la connexion... Par
contre il ne définissent pas si le vérouillage se fait au niveau de
l'enregistrement ou non.


--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"phil" a écrit :

peut on pas modifier ûn paramètre tel que le niveau d'isolation au niveau de
la base pour ne plus avoir de verrouillage table ?

"Christian Robert" a écrit :

> Bonjour,
>
> Les problèmes de verrous arrivent fréquement, la version 2005 permet
> d'améliorer légèrement les choses avec les modes d'isolation SNAPSHOT.
>
> Petite explication pour votre cas.
>
> Un utilisateur qui effectue un SELECT vérouille les données des tables (au
> niveau enregistrement ou page) pendant la durée d'execution. Cependant il
> s'agit d'un verrou partagé, c'est à dire que plusieurs utilisateurs peuvent
> faire simultanément des SELECT, de plus on ne vérouille jamais (ou presque)
> la table complète.
>
> Les problèmes de vérouillages arrivent quand vous avez un ou plusieurs
> utilisateurs qui effectuent des SELECT, et un utilisateur souhaitant réaliser
> une mise à jour. Les verrous partagés (des SELECT) empechent toute mise à
> jour tant qu'ils existent. Donc l'update doit attendre la fin des SELECT pour
> s'executer. De même si un utilisateur effectue un UPDATE, tous les lectures
> (SELECT) attendre la fin de celui-ci.
>
> Pour éviter ce genre de situation, appliquez ces quelques conseils :
> - Les mises à jours doivent être courtes et ne concerner que très peu
> d'enregistrements
> - Les transactions, doivent elles aussi être les plus courtes possibles.
> - Evitez les niveau d'isolation de transaction tel que SERIALIZABLE et
> REPEATABLE_READ quand celà n'est pas nécessaire
>
> Vous pouvez aussi comme vous l'indiquiez utiliser WITH(ROWLOCK) au niveau de
> la requête pour ne vérouiller que des enregistrements. Cependant cette
> méthode désactive la gestion dynamique des vérrous par SQL Server pour cette
> requête et risque de générer une surcharge de travail pour le serveur,
> d'autant que celui-ci sais gérer les verrous au niveau enregistrement.
>
> D'autres solutions plus complexes existent aussi...
>
> --
> Cordialement
>
> Christian Robert
> Consultant - Formateur chez Winwise
> MCT - MCDBA - MCSD
> MCTS & MCITP SQL Server 2005
>
>
> "phil" a écrit :
>
> > bonjour,
> > J'ai une application fourni par un editeur qui fonctionne en windows 2000 et
> > sqlserver 200.
> > Lorsque les utilisateurs font des select l'application verrouille toute la
> > table et bloque les autres utilisateurs.
> > Comment puis je faire pour changer le niveau deveouillage ( verrou au niveau
> > ligne par exemple ).