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

SQL Oracle Discussion :

DBMS_LOCK vs LOCK TABLE


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 87
    Par défaut DBMS_LOCK vs LOCK TABLE
    Bonjour,
    c'est quoi la différence entre dbms_lock et lock_table?
    aussi, est ce qu'il y a moyen de locker sur des enregistrements particuliers, sachant que ces enregistrement proviennent d'un jointure entre plusieurs tables?

  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
    DBMS_LOCK est un package permettant d'utiliser directement les services de verrouillage sans que les verrous soient forcémént liés à une table ou une ligne dans une table.

    Le seuil moyen de verrouiller explicitement des lignes dans des tables est d'utiliser la clause FOR UPDATE de la commande SELECT: la clause OF permet de restreindre le verrouillage à un sous-ensemble de tables (sinon toutes les lignes retournées par le SELECT de toutes les tables concernées sont verrouillées):

    http://download-uk.oracle.com/docs/c...2.htm#i2130052

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 87
    Par défaut
    Merci pour ta réponse, seulement j'ai une requête de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select cold1, cold2 into did,o_ip from 
    (select d.cold1, d.cold2 from  table1 p, table2 d
    where d.cold3=p.col1 and p.col1=parametre 
    order by d.cold1
    )
     where rownum  = 1 for update;
    et je veux faire le lock sur cold1 et cold2 de la table Table2.
    est ce que le for update marche toujours dans ce cas?
    merci
    AEMAG

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    un update d'une vue... m'est avis que ça va pas trop bien marcher

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 87
    Par défaut
    oui, ça ne marche pas du tout, en plus j'ai oublié qu'on ne fait pas un update for dans c conditions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.
    quelqu'un voit une piste pour ce que je veux faire?
    merci

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    en passant par un curseur probablement... là tu sélectionnes une colonne de chacune des tables alors évidemment Oracle ne sait pas quoi locker

    D'ailleurs, ordonné sur une colonne qui n'est pas de la table à mettre à jour c'est pour le moins curieux

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 87
    Par défaut problème de Dbms_lock
    Bonjour,
    j'exécute les deux scripts suivants :

    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
    declare
      v_result     number;
      v_lockhandle varchar2(200);
    begin
     
      dbms_lock.allocate_unique('control_lock', v_lockhandle);
     
      v_result := dbms_lock.request(v_lockhandle, dbms_lock.ss_mode);
     
      if v_result <> 0 then 
        dbms_output.put_line(
               case 
                  when v_result=1 then 'Timeout'
                  when v_result=2 then 'Deadlock'
                  when v_result=3 then 'Parameter Error'
                  when v_result=4 then 'Already owned'
                  when v_result=5 then 'Illegal Lock Handle'
                end);
      end if;
     
      insert into lock_test values ('started', sysdate);
      dbms_lock.sleep(5);
      insert into lock_test values ('ended'  , sysdate);
     
      commit;
     
    end;
    /
    et ensuite
    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
    declare
      v_lockhandle varchar2(200);
      v_result     number;
    begin
     
      dbms_lock.allocate_unique('control_lock', v_lockhandle);
     
      v_result := dbms_lock.release(v_lockhandle);
     
      if v_result <> 0 then 
        dbms_output.put_line(
               case 
                  when v_result=1 then 'Timeout'
                  when v_result=2 then 'Deadlock'
                  when v_result=3 then 'Parameter Error'
                  when v_result=4 then 'Already owned'
                  when v_result=5 then 'Illegal Lock Handle'
                end);
      end if;
     
    end;
    /
    j'ai deux questions :
    - pourquoi quand je fait select * from dbms_lock_allocated j'obient toujours 'control_lock' dans les données alors que j'ai déjà fait un release?
    - j'obitent des fois comme code de retour de dbms_lock.release ou dbms_lock.request la valeur 4, ce qui signifie : "Already own lock specified by id or lockhandle". comment corriger le problème surtout que je suis toujours dans la même section?
    merci
    AEMAG

Discussions similaires

  1. Lock table
    Par amelie6 dans le forum Oracle
    Réponses: 8
    Dernier message: 03/09/2011, 16h29
  2. [Hibernate] LOCK TABLE WRITE ?
    Par n!co dans le forum Hibernate
    Réponses: 11
    Dernier message: 22/01/2007, 13h12
  3. syntaxe de lock tables
    Par pas30 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 31/12/2006, 00h54
  4. Lock Table ?
    Par 000 dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/05/2006, 13h51
  5. LOCK TABLES et TRUNCATE TABLE
    Par killy-kun dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/08/2005, 15h52

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