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

Oracle Discussion :

Trouver qui lock un enregistrement (pas bloque)


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Par défaut Trouver qui lock un enregistrement (pas bloque)
    Bonjour,

    dans la boite ou je suis, pour empecher que les utilisateurs modifient la même ligne en même temps, nous faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE1 WHERE TBL_ID = 12345 FOR UPDATE NOWAIT
    Dans notre application nous avons un bouton modifier que met l'application en mode modification et donc sur ce bouton on fait le "SELECT FOR UPDATE NOWAIT" -> si on recoit un exception c'est que c locker sinon on passe en mode modification.

    Quand l'utilisateur reçoit l'exception, j'aimerai bien afficher un message d'erreur lui disant que tel ou tel autre personne est entrain de modifier pour cela j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	select substr(object_name,1,20) "Object",
      substr(os_user_name,1,10) "Terminal",
      substr(oracle_username,1,10) "User",
      OBJECT_TYPE "Type",  
      A.OBJECT_ID, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#,
      dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#)
    FROM
      SYS.V_$LOCKED_OBJECT A,
      SYS.ALL_OBJECTS B,
      SYS.V_$SESSION c
    WHERE
      A.OBJECT_ID = B.OBJECT_ID AND
      C.SID = A.SESSION_ID
    et j'ai remarqué que A.OBJECT_ID est different de ROW_WAIT_OBJ#, ce qui à mon sens est normal vu que personne n'est bloqué et en attente.

    A.OBJECT_ID represente TABLE1 tandis que ROW_WAIT_OBJ# une autre TABLE X

    Ceci reprensente un probleme car je ne peux pas recupere le rowid de la ligne lockée dans TABLE1 car dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#) me donne le ROWID dans TABLE X.

    Est-ce que vous avez une autre solution à me proposer ??

    Merci beaucoup

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    A.OBJECT_ID represente TABLE1 tandis que ROW_WAIT_OBJ# une autre TABLE X
    J'ai fait un petit test avec la 10.2.0.2 sur XP et je trouve bien que ROW_WAIT_OBJ# identifie dans DBA_OBJECTS la table dont la ligne est verrouillée et sur laquelle il y attente.

    Pourquoi faire un jointure avec SYS.V_$LOCKED_OBJECT et SYS.ALL_OBJECTS ? Je ferais plutôt une jointure seulement avec ALL_OBJECTS.

    J'ai un doute sur l'algorithme utilisé ROW_WAIT_ROW# est seulement valide si une transaction attend sur une autre transaction. Avec NOWAIT, il n'y a pas d'attente

    ROW_WAIT_ROW# NUMBER Current row being locked. This column is valid only if the session is currently waiting for another transaction to commit and the value of ROW_WAIT_OBJ# is not -1.
    Merci de préciser la version exacte d'Oracle utilisée.

  3. #3
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    Je crois que pour garantir accès unique au enregistrement (éventuel affichage d'utilisateur modifiant à l'heure actuelle), creation de propre "LOCKTAB" table est la meilleur solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    LOCKTAB
      id number
      sessionid number
      lockdate date
      utilisateur number
      ...
    Si l'utilisateur veut modifier la ligne, il devrait insérer dans LOCKTAB tout d'abord. Est au fin de mode modification, il devrait effacer de LOCKTAB.
    Beaucoup de travail, beaucoup de problèmes, mais on peut éviter V_$*LOCK*.

    Votre avis?

    DAB

  4. #4
    Membre confirmé Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Par défaut
    Bonjour, tous d'abord pour repondre a Pifor

    La version d'oracle de 10G release 2
    Ensuite pour moi c'est clair que avec NOWAIT, il n'y a pas d'attente, et que je ne puisse pas utilisé ROW_WAIT_ROW#

    Mais il doit bien y avoir un moyen de trouver la ligne lockée, sans passer pas une table intermediaire comme le propose DAB.cz

    Je vais te montrer ce que je fais

    A partir de mon application (.NET 2.0) je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from vorschlag where vor_id = 12345 for update nowait
    Ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select a.OBJECT_ID, object_name, A.SESSION_ID from
    V_$LOCKED_OBJECT A, ALL_OBJECTS B
    where A.OBJECT_ID = B.OBJECT_ID
    and oracle_username = 'EDV_1'
    me donne ce resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OBJECT_ID   OBJECT_NAME   SESSION_ID
    63311          VORSCHLAG     133
    ce qui est correct.

    si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select OBJECT_ID, object_name, ROW_WAIT_OBJ#
    from V_$SESSION, ALL_OBJECTS
    where ROW_WAIT_OBJ# = OBJECT_ID (+)
    and username = 'EDV_1'
    j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    OBJECT_ID  OBJECT_NAME  ROW_WAIT_OBJ#
    null            null                 88918
    quand je fait mon select for update nowait à partir de TOAD, ROW_WAIT_OBJ# à la valeur -1;

    voila si ça peut aider quelqu'un a comprendre le probleme

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Mais il doit bien y avoir un moyen de trouver la ligne lockée, sans passer pas une table intermediaire comme le propose DAB.cz
    Je ne crois pas qu'il y a de moyen simple de faire ça avec des vues V$ car:
    • les verrous posés sur des lignes sont écrits par Oracle dans les blocs des données et non dans une structure spécifique de la SGA
    • V$LOCK enregistre les demandes de verrous sur des lignes au niveau de la table concernée et non au niveau des lignes: si vous verrouillez 10 lignes différentes d'une même table en exclusif, vous n'aurez qu'une seule ligne dans V$LOCK (et non 10).

  6. #6
    Membre confirmé Avatar de schnourf
    Inscrit en
    Mars 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 66
    Par défaut
    Ok, donc soit je passe par une table intermediare, soit je mentionne dans le message d'erreur tout les utilisateurs qui lockent quelque chose (il n'y en a jamais plus que 5, en général 1-2).

    Merci quand même.

Discussions similaires

  1. Edition de graphe qui ne s'enregistre pas
    Par nenette69 dans le forum IHM
    Réponses: 1
    Dernier message: 11/03/2013, 23h21
  2. Réponses: 1
    Dernier message: 10/09/2010, 19h05
  3. [AC-2003] [FORMULAIRES] Champs de textes qui ne s'enregistrent pas
    Par Morgo dans le forum IHM
    Réponses: 4
    Dernier message: 29/04/2010, 18h09
  4. [AC-2007] champ qui ne s'enregistre pas
    Par pepsister dans le forum IHM
    Réponses: 27
    Dernier message: 12/04/2010, 11h26
  5. [MySQL] Date qui ne s'enregistre pas
    Par philippef dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/04/2006, 22h02

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