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 :

Foreign Key : lock sur la table référencée ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 42
    Par défaut Foreign Key : lock sur la table référencée ?
    Bonsoir à tous,

    Grosse interogation sur le comportement Oracle.
    Je suis en 10g.

    J'ai une table principale sur laquelle j'ai une clé primaire.

    J'ai une autre table qui référence ma table principale avec une clé étrangère (sur la clé primaire de ma table principale).

    Que se passe-t-il lorsque j'effectue un INSERT ou un UPDATE sur ma table référencant ma table principale ?

    Est-ce que le moteur d'Oracle effectue un lock sur ma principale ?

    Selon mes tests non.
    Le seul cas où j'ai un verous qui est posé :
    j'effectue un update sur ma table référencant ma table principale dans une session 001 et si j'essaie de faire un delete sur une ligne de ma table principale dans une autre session 002.
    Ma session 002 est bloquée tant que je n'ai pas effectué de commit sur ma session 001.


    Mais on m'a affirmé le contraire.

    D'avance merci pour votre aide.

  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
    Voir ce qui dit le Concepts Guide à ce sujet pour la 10g. Je crois aussi que dans les anciennes versions, le comportement était différent.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 42
    Par défaut
    J'ai pris connaissance de l'explication de la documentation Oracle.

    Voici le test que j'effectue :

    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
     
    create table T_PARENT (
      field_pk    number(5),
      field_name  varchar2(50),
      primary key (field_pk)
    );
     
    create table T_CHILD (
      field_pk  number(5),
      field_fk  number(5),
      field_name  varchar2(50),
      primary key (field_pk, field_fk),
      constraint t_child_fk foreign key (field_fk) references T_PARENT (field_pk)
    );
     
    -- Remplissage des tables T_PARENT et T_CHILD
    begin
      for i in 1..100 loop
        insert into t_parent (field_pk, field_name) values (i, 'Field name '||i);
      end loop;
      for i in 50..100 loop
        insert into t_child (field_pk, field_fk, field_name) values (i, i, 'Field name child '||i);
      end loop;
      commit;
    end;
    /
     
    -- T_CHILD est ROW LOCK RX DML T_CHILD
    update t_child set field_name = 'Field name child 88 (modified)' where field_pk = 88;
     
    commit;
     
    -- T_PARENT est ROW LOCK RX DML T_PARENT
    update t_parent set field_name = 'Field name 88 (modified)' where field_pk = 88;
     
    commit;
     
    -- Echec : violation de contrainte enregistrement enfant trouvée
    delete t_parent where field_pk = 88;
     
    commit;
     
    -- T_CHILD est ROW LOCK RX DML T_CHILD
    -- T_PARENT est ROW LOCK RS DML T_PARENT
    delete t_child where field_pk = 88;
    J'ai testé sur une Oracle XE, voici la version :

    Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product


    Je n'arrive pas à reproduire le comportement décrit.

    Est-ce dû au fait que j'effectue mon test sur une version XE ?

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je n'arrive pas à comprendre votre problème. Quel est exactement le comportement que vous n'arrivez pas à reproduire ? Avez remarqué que la modification de la clé primaire sur la table parent n'est pas le même chose que la modification d'une autre colonne dans la même table ?

    Le comportement est le même depuis Oracle 7.3

  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
    Il y a quand même eu certains changements depuis Oracle 9 d'après la doc Oracle 9.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 42
    Par défaut
    Dans mon code exemple, j'essaie d'arriver à ce qui est écrit dans la doc Oracle :

    Si je mets jour la table T_PARENT, la table T_CHILD doit être lockée.
    Car il n'y a pas d'index sur le champ foreign key.

    Or, d'après mes tests, la table T_CHILD n'est pas lockée sauf pour un delete.

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par pifor Voir le message
    Il y a quand même eu certains changements depuis Oracle 9 d'après la doc Oracle 9.
    D'accord vous avez raison c'est pas pareil

Discussions similaires

  1. lock sur ma table
    Par kaking dans le forum Administration
    Réponses: 6
    Dernier message: 02/07/2008, 14h02
  2. Désactivation de toutes les Foreign Key pointant sur une table.
    Par sybaris dans le forum Développement
    Réponses: 3
    Dernier message: 29/06/2008, 20h57
  3. foreign key multiple (vers 2 tables ou plus)
    Par Bombastus dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2006, 16h26
  4. comment gérer plusieurs locks sur une table?
    Par charluber dans le forum Oracle
    Réponses: 4
    Dernier message: 18/04/2006, 21h28
  5. Faire un Lock sur une table pendant l'exec d'un DTS
    Par Pete dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2005, 14h17

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