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 :

lock et jointure


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 7
    Points
    7
    Par défaut lock et jointure
    Bonjour
    j'ai 3 tables :A,B,C ou B est la table de lien entre A et C (1 record de A est associé à 1 à n record dans C).

    Table A........Table B.........Table C
    X................X / 1................1
    Y................X / 3................2
    Z................X / 2................3
    . ...............Z / 4................4

    Suppression:
    Lorsque je veux supprimer un record dans A, je commence par supprimer les associations dans B.
    1° begin trans
    2° delete records X dans Table B
    3° delete record X dans Table A
    4° commit

    Mise à jour:
    Dans une application windows .NET, lorsq'un utilisateur veut modifier le record Z dans A (et donc dans B), je lock les records Z dans les tables A & B comme ceci:
    "SELECT * FROM A INNER JOIN B ON ... WHERE ID=Z FOR UPDATE NOWAIT"
    ensuite l'utilisateur valide sa saisie et je fais un COMMIT.

    problème :
    Lorsq'un utilisateur modifie le record Z et que pendant ce temps un autre utilisateur veut supprimer le record X, j'ai comme un deadlock sur l'étape 3° de la suppression. D'après ce que je vois, oracle a posé un verrou exclusif sur la table B.

    j'ai utilisé la clause "FOR UPDATE OF A.ID" pour le lock de mise à jour et dans ce cas pas de blocage mais les records X de la table B ne sont pas lockés

    Question : comment verrouiller les records X des tables A & B tout en permettant le verrouillage en vue d'une mise à jour de record Y des tables A & B ?
    Merci

  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
    Points : 3 597
    Points
    3 597
    Par défaut
    En général, un deadlock apparaît si les verrous sont pris dans un ordre différent. Exemple:

    Session 1:
    verrouiller lignes table A
    verrouiller lignes table B

    Session 2:
    verrouiller lignes table B
    verrouiller lignes table A

    Ce deadlock disparaît si toutes les sessions verrouillent dans le même ordre:


    Session 1:
    verrouiller lignes table A
    verrouiller lignes table B

    Session 2:
    verrouiller lignes table A
    verrouiller lignes table B


    Notez aussi que:
    1. Oracle ne fait jamais d'escalade de verrous de type x verrous lignes devient un verrou de niveau table.
    2. Il n'y a pas de "begin tran" dans Oracle: une transaction est automatiquement démarrée lors de la première écriture dans la base (y compris SELECT ... FOR UPDATE puisque les verrous sur les lignes d'une table sont écrits dans les blocs des extents du segment de la table).

  3. #3
    Membre averti Avatar de mongilotti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2003
    Messages : 314
    Points : 303
    Points
    303
    Par défaut
    si tu fais select ****** for update, toute la table est verrouillée.

  4. #4
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Bonjour, il faudrait que tu aies un index sur la foreign key dans B, ou du moins un index qui a cette colonne comme première colonne. Alors, Oracle n'aura pas à poser un verrou au niveau table lorsque tu supprime X dans A. Il pourra seulement verrouiller la valeur X grâce à l'index.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

Discussions similaires

  1. Jointures en SQL
    Par Guizz dans le forum Langage SQL
    Réponses: 10
    Dernier message: 04/06/2003, 12h21
  2. Row lock
    Par cassandra dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 09/04/2003, 16h07
  3. Réponses: 14
    Dernier message: 17/03/2003, 18h31
  4. Jointures INNER et jointures classiques ???
    Par UbiK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2002, 10h29
  5. jointure renvois pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 7
    Dernier message: 29/08/2002, 12h51

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