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

PostgreSQL Discussion :

[Verrou] SELECT FOR UPDATE


Sujet :

PostgreSQL

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut [Verrou] SELECT FOR UPDATE
    Bonjour,
    Je cherche a faire a verrouiller une ligne sans que les autres utilisateurs ne puissent la verrouiller tant qu'un commit n'est été fait, je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * From matable Where idmatable=1 FOR UPDATE
    Et j'aimerais que tous les utilisateurs n'attendent pas (avec ceci ils sont bloqués), si ils veulent faire la meme chose avant que l'utilisateur ayant vérouillé ait fait un Commit ....

    Si quelqu un a une idée elle sertait la bienvenue!!!

    PS : J ai pu voir que sous oracle ce genre de chose etait possible en faisait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT... FOR UPDATE NOWAIT
    y a t il une commande pour faire la meme chose avec postgres ?

    Le lock ne m interesse pas non plus car il ne permet pas de verrouiller seulement un tuple ... Enfin si je me trompe, j'aimerais savoir comment !!


    Merci

  2. #2
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Personne n'a d'idée pour faire ce genre de chose ??

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    veux-tu annuler les SELECT FOR UPDATE concurrents uniquement s'ils portent exactement sur les mêmes enregistrements, ou tolères-tu que l'annulation porte sur une tentative de mise à jour de la même table, mais pas forcément sur les mêmes enregistrements ?

    Dans le deuxième cas, il faut savoir qu'un SELECT FOR UPDATE appose le verrou ROW SHARE sur la table, et qu'il suffit donc de vérifier la présence de ce verrou dans la table système pg_locks.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Citation Envoyé par GrandFather
    Bonjour,

    veux-tu annuler les SELECT FOR UPDATE concurrents uniquement s'ils portent exactement sur les mêmes enregistrements
    C'est ce que je veux faire effectivment ! Quand quelqu'un a fait un select for update, je veux que les autres qui essaieraient de faire un select for update sur ce meme enregistrement soient "dégagés" directement ...
    La en ce moment quand je fais ce genre de choses, l'autre reste bloqué tout le temps que le premier n'a pas fait de commit

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Personne ne sais si c''est possible de faire ce genre de choses ? Ou bien si un type de lock permet de faire ca ?

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    A part la technique consistant à vérifier la présence du ROW SHARE (qui n'est pas idéale, un autre client peut être rejeté parce qu'un SELECT FOR UPDATE a posé ce verrou sur la table, alors que ce ne sont pas les mêmes enregistrements qui sont concernés), je ne crois pas qu'il y ait d'autres solutions...

    La doc de PostgreSQL concernant les verrous au niveau ligne tendrait à confirmer cette impression :
    PostgreSQL doesn’t remember any information about modified rows in memory, so it has no limit to the number of rows locked at one time.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Citation Envoyé par GrandFather
    A part la technique consistant à vérifier la présence du ROW SHARE
    Comment faire cela ? J avoue que la j'ai pas tout compris

    En fait le select for update que je fais marche très bien car il bloque bien les enregistrements concernés mais bon j'arrive toujours pas a trouvé l'options afin de ne pas faire de file d'attente ....

  8. #8
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Il n'existe pas, à ma connaissance, d'option de ce genre.

    La seule solution que je connaisse, et que j'ai mentionnée plus haut, est pour un client de vérifier dans la vue système pg_locks s'il n'y aurait pas un verrou ROW SHARE posé sur la table par un SELECT FOR UPDATE d'un autre client, avant de tenter son SELECT FOR UPDATE.

    La description et l'utilisation de la vue pg_locks sont décrits dans la doc PostgreSQL : http://www.postgresql.org/docs/8.0/static/view-pg-locks.html
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  9. #9
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    J'y ai pensé, mais j avoue que je comprends pas tres bien cette table, enfin elle ne me sert pas a grand chose car je voudrais récuperer l'enregistrement qui a été bloqué et non la table...
    Je pense que je vais devoir faire un truc un peu crade consitant a mettre une colonne en plus dans ma table afin de definir si l'enregistrement est bloqué ou non Ca me plait pas des mas, car le temps de verifier et de changer cette variable d'autres utilisateurs peuvent faire la meme chose et donc entrer en conflit mais bon faut bien trouver une solution
    Enfin si quelqu'un a une solution avec la vue pg_locks je suis preneur !

  10. #10
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    J'ai un petit probleme si je met des une colone verrou dans ma table et que je notifie a cette colonne par true (par exemple) pour verrouiller l'enregistrement. Si mon application plante avant de devérouiller l'enregistrement comment je fais ? Cet enregistrement est bloqué a vie ???

  11. #11
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 141
    Points : 128
    Points
    128
    Par défaut
    Bon ca y est la version 8.1 prendra en compte le NoWait !! Ce qui resout parfaitement mon probleme

    http://www.postgresql.org/docs/8.1/s...R-UPDATE-SHARE

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

Discussions similaires

  1. Select For Update (ib 6)
    Par Radj972 dans le forum InterBase
    Réponses: 1
    Dernier message: 07/02/2007, 17h14
  2. select for update LOCK 3 10gR2
    Par petitfrere dans le forum Oracle
    Réponses: 1
    Dernier message: 01/12/2006, 18h52
  3. Select For Update Nowait
    Par e1lauren dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 28/09/2006, 22h04
  4. [FORMS PL/SQL] Select for Update
    Par taska dans le forum Forms
    Réponses: 3
    Dernier message: 30/08/2006, 10h33
  5. [MySql5]select ... for update
    Par melou dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/04/2006, 11h11

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