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

DB2 Discussion :

Vérifier l'existence d'un verrou sur un ligne


Sujet :

DB2

  1. #1
    Membre à l'essai
    Homme Profil pro
    Assistant Projet Informatique
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant Projet Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut Vérifier l'existence d'un verrou sur un ligne
    Bonjour,

    J'ai codé un programme en C# qui manipule des données db2.
    Parfois, j'obtiens cette erreur : SQL0913 Ligne ou objet TABLEX de SCHEMAX type *FILE en cours d'utilisation.
    Je pense que c'est lorsque mon programme tente de mettre à jour une ligne qui est verrouillée.

    D'où ma question, comment peut-t-on vérifier qu'une ligne possède ou non un verrou avant de la mettre à jour, (de préférence en C#) ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    C'est justement le test du code SQL -913 qui permet de vérifier la présence d'un verrou

    Normalement, le verouillage est temporaire, il devrait être levé par l'application qui l'a posé, mais des fois c'est long (exemple verrouillage de toute une table pour exécuter un utilitaire) ou ce n'est pas fait (exemple programme qui boucle)

    Attention a bien vérifier aussi la taille des verrous (row, page, table) et le niveau d'isolation (UR, CS, RR, RS)

    Il peut arriver que des applications verrouillent toute une table via le phénomene de lock escalation, d'où -913 dans les applis concurrentes

  3. #3
    Membre à l'essai
    Homme Profil pro
    Assistant Projet Informatique
    Inscrit en
    Janvier 2014
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant Projet Informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2014
    Messages : 16
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Bonjour,

    C'est justement le test du code SQL -913 qui permet de vérifier la présence d'un verrou

    Normalement, le verouillage est temporaire, il devrait être levé par l'application qui l'a posé, mais des fois c'est long (exemple verrouillage de toute une table pour exécuter un utilitaire) ou ce n'est pas fait (exemple programme qui boucle)

    Attention a bien vérifier aussi la taille des verrous (row, page, table) et le niveau d'isolation (UR, CS, RR, RS)

    Il peut arriver que des applications verrouillent toute une table via le phénomene de lock escalation, d'où -913 dans les applis concurrentes
    En fait je cherche à coder un test, dans mon programme en c#, que je puisse faire avant d'exécuter ma commande (exemple : if(!rowIsBlocked())), et qui me permettrait de vérifier si la ligne est verrouillée ou non.
    Actuellement je ne fais que récupérer l'Exception dans un log...

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par q.migliore Voir le message
    En fait je cherche à coder un test, dans mon programme en c#, que je puisse faire avant d'exécuter ma commande (exemple : if(!rowIsBlocked())), et qui me permettrait de vérifier si la ligne est verrouillée ou non.
    Actuellement je ne fais que récupérer l'Exception dans un log...
    Ce n'est pas possible et ça n'aurait pas d'intéret, car rien n'indique que le diagnostic qui serait reçu serait le même que celui obtenu lors de la mise à jour effective, l'état des verrous ayant pu évoluer entre les 2 appels.
    Utiliser le diagnostic d'une requete sql après exécution est la bonne démarche.
    Attention à ne pas se limiter à l'analyse du sqlcode qui est parfois insuffisante, il faut souvent y ajouter d'autres attributs de la SQLCA

    Sur les plates formes Z/OS, IBM fournit le service DSNTIAR qui analyse la SQLCA et permet d'afficher en clair le diagnostic de toute requete, à utiliser sans modération ;-)

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Exemple d'utilisation du service DSNTIAR en COBOL

    01 ER-MESSAGE.
    02 ER-TEXT-LONG PIC S9(4) COMP VALUE +960.
    02 ER-LIGNE PIC X(120) OCCURS 8.
    01 ER-LIGNE-LONG PIC S9(9) COMP VALUE +120.

    [. . .]
    EXEC SQL
    SELECT NUMSECU INTO :HNUMSECU
    FROM VUE001
    WHERE IDIND= :HIDIND
    END-EXEC
    IF SQLCODE NOT = ZEROES
    AND SQLCODE NOT = 100
    CALL 'DSNTIAR' USING SQLCA
    ER-MESSAGE
    ER-LIGNE-LONG
    DISPLAY ER-MESSAGE
    PERFORM 999-FIN-ANORMALE
    END-IF.

    Exemple de résultat (ici sur un ordre insert) :
    é DSNT408I SQLCODE = -803, ERROR: AN INSERTED OR UPDATED VALUE
    IS INVALID BECAUSE INDEX IN INDEX SPACE T02IN01 CONSTRAINS
    COLUMNS OF THE TABLE SO NO TWO ROWS CAN CONTAIN DUPLICATE VALUES IN THOSE COLUMNS. RID OF EXISTING ROW IS X'000010ED28'.
    DSNT418I SQLSTATE = 23505 SQLSTATE RETURN CODE
    DSNT415I SQLERRP = DSNXRINS SQL PROCEDURE DETECTING ERROR
    DSNT416I SQLERRD = -110 13172739 0 13817814 -490143744
    0 SQL DIAGNOSTIC INFORMATION
    DSNT416I SQLERRD = X'FFFFFF92' X'00C90003' X'00000000' X'00D2D7D6' X'E2C90000' X'00000000' SQL
    DIAGNOSTIC INFORMATION

    Description de la SQLCA :
    http://www-01.ibm.com/support/knowle....0%2F2-10-11-0

Discussions similaires

  1. [T-SQL]verrou sur une ligne avant un select
    Par dinobogan dans le forum Sybase
    Réponses: 3
    Dernier message: 28/06/2007, 14h36
  2. Réponses: 1
    Dernier message: 18/02/2007, 20h30
  3. Réponses: 3
    Dernier message: 24/06/2004, 11h23
  4. Vérifier l'existence d'un répertoire
    Par Crazyblinkgirl dans le forum ASP
    Réponses: 4
    Dernier message: 24/06/2004, 11h13
  5. [VB6]Existence d'un image sur un control
    Par oazar dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/04/2004, 17h00

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