IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

PS Cursor ou transaction = verrou [2008R2]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut PS Cursor ou transaction = verrou
    Bonjour,

    Je rencontre un problème dans une PS, que je n'arrive à reproduire en test.

    Dans cette PS je déclare un cursor selon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE CurEre CURSOR FOR SELECT....
    If champ = xx begin   
    BEGINTRANSACTION
    update ....
    update ....
    COMMIT TRANSACTION
    end
    FETCH NEXT FROM CurEre
    ....
    CLOSE CurEre
    
    Le but étant de parcourir une table et selon le contenu de "champ" je fais deux updates dans d'autres tables en démarrant une transaction qui est commité juste après les updates.

    Dans certain cas, que je n'ai pu isoler, j'ai un message me signifiant que:
    La transaction (id N°xx) a été bloquée sur les ressources verrou par un autre processus et a été chosie comme victime.

    Je comprends bien le sens de ce message, mais je voudrais savoir si c'est juste pendant le BeginTrans...Commit que ce message est généré ou bien le fait d'être sous une déclaration CURSOR ?
    Ou autrement, le fait de déclarer un CURSOR pose t il des verrous sur la table concernée ?

    Merci pour votre aide,

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour

    Pourquoi utilisez vous un curseur pour faire ça. Vous n'avez pas mis les requêtes, mais il me semble que vous pourriez faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN TRAN
    UPDATE ...
    WHERE colonne = 'xx'
     
    UPDATE ...
    WHERE colonne = 'xx'
    COMMIT TRAN

  3. #3
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour

    Pourquoi utilisez vous un curseur pour faire ça. Vous n'avez pas mis les requêtes, mais il me semble que vous pourriez faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN TRAN
    UPDATE ...
    WHERE colonne = 'xx'
     
    UPDATE ...
    WHERE colonne = 'xx'
    COMMIT TRAN
    Bonjour,

    merci pour votre réponse,

    Effectivement, je n'ai pas mis la totalité du code pour simplifier la question.

    En fait l'objectif est de parcourrir un ensemble de résultat suite à une requête et en fonction de la valeur de certain champ de cette requete effectuer ou non un ou des updates.


    Sous delphi je ferai un truc comme ça (en "code" de principe):
    Sur un select qui renvoie n lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while not eof do begin
            if fieldbyname('champ').asinteger:= 1 then begin
               startTransaction;
               update table1 set tbl1champ = 0 where tbl1ChampId = :id;
               update table2 set tbl2champ = 999 where tbl2ChampId = :id;
               commit;
            end;
          next;
    end;
    Mais je pense que c'est plus efficace de tout faire dans la PS.

    Ma question était juste, lorsque l'on déclare un curseur, y a t il un verrou de posé ?


    Maintenant, sur l'opportunité ou non d'utiliser un cursor, là je ne sais pas.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par castorcharly Voir le message
    ...

    Ma question était juste, lorsque l'on déclare un curseur, y a t il un verrou de posé ?
    Tout dépend de la façon dont vous avez déclarer le curseur.

    Si vous avez juste fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE CurEre CURSOR FOR SELECT....
    Vous avez créé un curseur dynamique, scrollable, misajourable....
    Si vous ne faites pas de mise à jour dans les lignes des tables du curseur, si vous n'avez pas beoin de revenir en arrière ou de vous positionner à la ligne 36541 et si vous ne voulez pas que le curseur reflète les valeurs modifiées par d'autres utilisateurs, alors il faut utiliser différentes options, parmi lesquelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOCAL  FORWARD_ONLY STATIC READ_ONLY
    De ce fait vous n'aurez pas de verrou.

    Cependant il est idiot d'utiliser un curseur qui ne peut pas être optimisé et dans votre cas génère des verrous mortels, au lieu d'une requête qui elle peut l'être.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre éclairé
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 423
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Tout dépend de la façon dont vous avez déclarer le curseur.

    Si vous avez juste fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE CurEre CURSOR FOR SELECT....
    Vous avez créé un curseur dynamique, scrollable, misajourable....
    /...
    .../
    Cependant il est idiot d'utiliser un curseur qui ne peut pas être optimisé et dans votre cas génère des verrous mortels, au lieu d'une requête qui elle peut l'être.

    A +
    Bonjour Sql Pro,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE CurEre CURSOR FOR SELECT....
    Oui, c'est bien ce que j'ai fait, donc là il y a verrou si je comprends bien.

    Pour le fait que mon code est idiot, c'est fort possible, je n'ai pas votre expérience dans ce langage.
    Mais effectivement, je mets à jour la table que je parcours, ainsi que d'autres.
    Il y a peut être une meilleure méthode, c'est pour ça que je viens ici.

    Le Transacsql est un langage complexe et les documentations touffues.
    Il est difficile et long de l'apprendre et d'en connaître toutes les subtilités.

    J'ai fait l'acquisition de livre sur le sujet et j'y ai appris pas mal de chose, mais je suis loin d'en appréhender le début du commencement.

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Bonjour,
    Postez votre code, nous vous montrerons comme éviter les curseurs...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur SP imbriquées, Transaction et Verrou
    Par Sacha999 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/11/2007, 19h59
  2. Transaction & Cursor
    Par digital_versatil dans le forum Connexion aux bases de données
    Réponses: 3
    Dernier message: 23/02/2007, 20h52
  3. Transaction, Curseur, verrou
    Par Samish dans le forum ASP
    Réponses: 1
    Dernier message: 21/01/2006, 19h06
  4. transaction et verrou sous asp
    Par sex-sansbol dans le forum ASP
    Réponses: 2
    Dernier message: 18/08/2004, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo