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 :

comment gérer plusieurs locks sur une table?


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2005
    Messages : 4
    Points : 6
    Points
    6
    Par défaut comment gérer plusieurs locks sur une table?
    Je travaille sur une application où plusieurs process ont un accès concurentiel sur une table. Chaque process génère un lock sur tout et une partie de cette table. Quelqu'un peut-il m'expliquer le mécanismes des locks et des vérouillages afin que le vérrouillage de chaque process n'interfere pas avec les autre? Peut-on mettre un lock uniquement sur une plage de données?

  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
    Il y essentiellement 2 types de verrous exclusifs pour les lignes dans une table:

    - les verrous explicitements pris par le code client avec l'instruction SQL: SELECT ... FOR UPDATE
    - les verrous implicitements pris par le SGBD avant de faire un INSERT, UPDATE ou DELETE.

    Notez qu'Oracle ne prend pas de verrou partagé en lecture sur les lignes grâce à sa gestion de multi-versioning: dans Oracle, les SELECT ne sont pas en général bloqués par un UPDATE ou DELETE dans une autre transaction, de même un UPDATE ou UN DELETE ne bloquera pas un autre SELECT dans une autre transaction (ici SELECT signifie SELECT sans la clause FOR UPDATE).

    De plus Oracle ne fait pas de promotion de verrou de ligne au niveau table dans le cas où il y aurait un nombre important de verrous sur sur des lignes d'une même table.

    Comme dans les autres SGBD, les verrous sont relâchés au COMMIT ou ROLLBACK.

    En général, c'est plus simple et plus puissant qu'avec SQL Server ou Sybase.

  3. #3
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Attention aux interblocages !!

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select * from mytable where champ1=1 for update [A] 
    Select * from mytable where champ1=2 for update [B] 
    Select * from mytable where champ1=2 for update [A] 
    Select * from mytable where champ1=1 for update [B]
    Ni [A], ni [B] ne peuvent continuer car ils sont en situation d'interblocage

    Pour etre plus securisé, tu peux faire une table VERROU avec une ligne pour chaque table concernée par des acces concurrentiels. A chaque fois que tu veux acceder a une table, tu lock sa ligne dans la table VERROU
    et ensuite tu travailles sur la table concernée.

    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  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
    Pour éviter les interblocages, il suffit en général que les transactions demandent leurs verrous toujours dans le même ordre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select * from mytable where champ1=1 for update [A] 
    Select * from mytable where champ1=2 for update [A] 
     
    Select * from mytable where champ1=1 for update [b] 
    Select * from mytable where champ1=2 for update [b]
    La première transaction à demander le verrou l'obtient et la deuxième sera en attente sur le premier.

  5. #5
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Citation Envoyé par pifor
    Pour éviter les interblocages, il suffit en général que les transactions demandent leurs verrous toujours dans le même ordre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Select * from mytable where champ1=1 for update [A] 
    Select * from mytable where champ1=2 for update [A] 
     
    Select * from mytable where champ1=1 for update [b] 
    Select * from mytable where champ1=2 for update [b]
    La première transaction à demander le verrou l'obtient et la deuxième sera en attente sur le premier.
    Pas forcement facile a réaliser
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/07/2012, 15h06
  2. Comment ajouter un lock sur une table iBatis
    Par superviny dans le forum Spring Web
    Réponses: 1
    Dernier message: 06/01/2012, 15h24
  3. [VB.Net/Dataview] Comment gérer un filtre sur une colonne de type date ?
    Par silatchom dans le forum Accès aux données
    Réponses: 3
    Dernier message: 07/07/2006, 19h28
  4. Comment supprimer un verrou sur une table ?
    Par Laure13 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/03/2006, 15h10
  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