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 :

Thread et lock de tables


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut Thread et lock de tables
    Bonjour,

    J'ai crée un thread qui fait un select sur plusieurs tables Oracle.
    Au moment ou ce thread tourne, je veux
    - laisser l'accès en lecture à ces tables (via une appli web)
    - bloquer l'accès en écriture sur ces tables (toujours via l'appli web)

    Au jour d'aujourd'hui je ne sais pas comment tout ca se comporte, alors je voudrais tester.
    J'ai donc pensé à créer une transaction qui ferait une update dans une table, et de ne pas committer avant la fin du thread pour voir ce qui se passe..
    Le problème, c'est que je ne sais pas écrire une transaction (tout bete) dans dvisualiser (en Oracle).

    Mon objectif est de pouvoir signaler à un utilisateur de l'appli web que sa mise à jour n'a pas été faite, le thread étant prioritaire.

    Quelqu'un peut il m'aider ?

    Merci beaucoup !

    Flo

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Un select for update permet de mettre en place un lock de maniére exclusive sur la table. C'est ainsi qu'oracle va gérer les accées concurents et ceux jusqu'au commit ou rollback . Concernant la lecture celle ci est toujours autorisé durant ton lock . Si nécessaire elle se servira de l'image avant

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    Merci Jouad de ta réponse.

    Par contre, je ne sais pas quoi faire de ce "select for update"
    Je dois remplacer le "SELECT" sur les tables que je veux verrouiller par ce "select for update" ? Meme si je ne fais pas de mise à jour sur ces tables apres ?..

    Comment je peux tester en manuel ce que donne le conflit ?... :s

    Merco

  4. #4
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    Je vous conseille de lire attentivement le section How Oracle locks data (http://download-west.oracle.com/docs...cnsis.htm#2841) du Oracle9i Database Concepts et vous avez des exemples détaillés ici http://download-west.oracle.com/docs...cnsis.htm#3330
    avec LOCK TABLE et SELECT FOR UPDATE.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Points : 84
    Points
    84
    Par défaut
    merci bcp !

    J'ai compris le principe général des lock, mais comme ca pour tester depuis ToadFree ou autre logiciel, je bug

    Je ne sais pas écrire une transaction pour utiliser ces locks et j'ai beau chercher aucun site ne propose d'exemple...

  6. #6
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    Avec Oracle, une transaction: c'est une suite de commandes SQL qui se termine par COMMIT ou ROLLBACK. Il n'y a pas de BEGIN TRANSACTION comme dans d'autre systèmes: Oracle démarre implicitement une transaction à la première commande SQL qui suit un COMMIT ou ROLLBACK (ou à la première commande SQL qui suit le démarrage d'une connexion).

    Ce lien http://download-west.oracle.com/docs...cnsis.htm#3330
    vous donne des exemples avec des transactions qui se terminent avec ROLLBACK au début puis par COMMIT à la fin.

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Un exmple concret :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
     
    create table dvp_test  ( a varchar2(10)); 
    insert into dvp_test   values ( 'DVP') ; 
    commit ; 
     
     
    select object_name , a.object_id , locked_mode 
    from dba_objects a, V$LOCKED_OBJECT b
    where a.object_id =b.object_id ; 
     
    select * from dvp_test for update ; 
     
    select object_name , a.object_id , locked_mode 
    from dba_objects a, V$LOCKED_OBJECT b
    where a.object_id =b.object_id ; 
     
     
    SQL> create table dvp_test  ( a varchar2(10)); 
     
    Table créée.
     
    SQL> insert into dvp_test   values ( 'DVP') ; 
     
    1 ligne créée.
     
    SQL> commit ; 
     
    Validation effectuée.
     
    SQL> select object_name , a.object_id , locked_mode 
      2  from dba_objects a, V$LOCKED_OBJECT b
      3  where a.object_id =b.object_id ; 
     
    aucune ligne sélectionnée
     
     
    SQL> select * from dvp_test for update ; 
     
    A
    ----------
    DVP
     
    SQL> select object_name , a.object_id , locked_mode 
      2  from dba_objects a, V$LOCKED_OBJECT b
      3  where a.object_id =b.object_id ; 
     
    OBJECT_NAME
    --------------------------------------------------------------------------------
     OBJECT_ID LOCKED_MODE
    ---------- -----------
    DVP_TEST
       4609728           3
     
     
    SQL> commit ;
     
    Validation effectuée.
     
    SQL>  select object_name , a.object_id , locked_mode 
      2   from dba_objects a, V$LOCKED_OBJECT b
      3   where a.object_id =b.object_id ; 
     
    aucune ligne sélectionnée

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/01/2010, 16h15
  2. [Multi-thread] Comment lock l'acces a un containeur de la STL ?
    Par Izidor's dans le forum Threads & Processus
    Réponses: 5
    Dernier message: 14/10/2009, 13h09
  3. Thread et lock pour écrire dans un fichier?
    Par DarkHerumor dans le forum C#
    Réponses: 3
    Dernier message: 31/03/2009, 10h40
  4. Lock de table et SQL Management studio
    Par The eye dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/08/2007, 18h30
  5. Réponses: 8
    Dernier message: 06/09/2006, 18h36

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