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 :

Accés concurrent, verrou


Sujet :

PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut Accés concurrent, verrou
    Bonjour,

    je commence un mini projet en python avec accés à une BDD postgre via le module psycopg2.
    Je parviens a verrouiller des lignes d'une table grâce à un SELECT.. FOR UPDATE.
    Là je suis content!

    Par contre, si j'ouvre une 2e session et tente d'accéder aux memes lignes avec : SELECT.. FOR UPDATE. J'ai la session qui se fige tant que la premiere n'a pas fait son COMMIT (ce qui est normal).

    Comment puis je tester si les lignes sont verrouillées au préalable sans faire attendre que la 1ere session se termine? Peut on savoir qui bloque les lignes? (l'ideal serait de faire apparaitre un message pour dire untel réserve les lignes..)
    j'ai consulté divers forums où on parle de pg_locks mais j'ai très peu d'info dessus.

    Pouvez vous m'aider?

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Par principe ce n'est pas dans le code applicatif que l'on gère les verrous (d'ailleurs on ne devrait jamais avoir besoin de poser des verrous explicites). Le SGBDR le fait tout seul et il est certainement meilleur que vous à ce niveau car il est capable de prévoir la granularité (ligne, page, bloc, table...) comme le type (partagé, exclusif, schéma, intention, update...) de verrous de manière dynamique (en fonction du contexte et notamment de la concurrence et de la charge à un instant t)

    Mais si vous voulez des performances catastrophiques et des deadlocks en pagaille, allez-y, amusez vous à tout verrouiller !

    En revanche, vous pouvez gérer des transactions. Ca c'est la manière intelligente de développer des applications cohérentes.

    Lisez ce que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/techniques/
    http://sqlpro.developpez.com/isolation-transaction/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    On utilise pg_locks principalement pour trouver la source d'un problème en tant qu'administrateur de base de données.
    Mais s'il s'agit de mettre en oeuvre une stratégie de coopération/exclusion entre sessions concurrentes, c'est probablement une mauvaise voie. Il faudrait préciser le besoin fonctionnel. Sinon il y a des fonctions de verrouillage coopératif dans postgresql (advisory locks), voir la doc à ce sujet.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    Admettons que plein d'intervenants sont amenés à modifier une fiche ( article par exemple car c'est le cas pour notre gestion de stock). Avec notre "SGBD" actuel, nous reservons la fiche, l'utilisateur fait ses modifs et on fait un update qui libere la fiche.
    Personne d'autre ne doit pouvoir etre en modification si un utilisateur modifie la fiche en cours.
    alors, Comment gerer cela en postgres? (verouiller un temps indefini)

    peut être je dois procéder autrement et que je m'inspire trop du fonctionnement de notre "SGBD"..

    les avis sont les bienvenus

    merci

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Ce type de verrrouillage "pendant la saisie" doit idéalement être géré par l'applicatif.
    Conceptuellement, une simple colonne dans une table qui dit "la fiche X est actuellement verrouillée par l'utilisateur Y" est suffisante comme technique de base.
    Pour prendre le verrrou, un UPDATE sur la ligne de la fiche en question suivi d'un test pour savoir si la ligne a bien été mise à jour suffit à assurer l'exclusion mutuelle. Il faut ensuite faire un commit sans attendre.

    Ce qu'il ne faut pas faire dans la plupart des SGBD, PostgreSQL inclus, c'est laisser des transactions ouvertes pendant que l'utilisateur saisit parce que ça bloque des ressources pour un temps indéterminé.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    ça c'est du verrouillage pessimiste côté client. Le gros problème est : que va t-il se passer si l'utilisateur :
    1) ne termine jamais sa session de travail (prend sa pause et tombe dans l'escalier en plien modif....)
    2) sort de l'application sans passer par la bonne action
    3) le PC fait un écran bleu
    ???

    Dans tous les cas gérer les verrous manuellement en mode pessimiste à l'heure, des SGBDR de type C/S reste une hérésie. Il faut changer votre manière de faire et abandonner vos vieilles habitudes

    Sachez d'autant plus que dans un curseur, (les datagrid "live" reposent sur des curseurs) cette gestion est automatisée.. La question est :
    es-te vous en mode client lourd ou léger ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2009
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2009
    Messages : 195
    Points : 156
    Points
    156
    Par défaut
    Bonjour,


    prenons le cas suivant :
    - un utilisateur consulte sur une fenetre une fiche 'article' (simple select) avec differentes infos (poids=10 , volume=2 , couleur=bleu)
    - un autre utilisateur consulte la même fiche à l'ecran
    - le premier saisie un poids de 15 et fait un update (de tout) avec ses données de l'ecran -> (poids=15, volume=2, couleur=bleu)
    - l'autre utilisateur (il voit toujours poids=10..) saisie volume=5 et fait un update avec ses données de l'ecran -> on revient à poids=10

    C'est sans doute un cas d'ecole mais je vois pas trop comment gérer le truc.

    Notre système est fait avec un langage limité (proche du basic et je suis l'un de rares à connaitre le langage spécifique où on doit faire à chaque fois des pirouettes pour s'en sortir..) et python semble palier aux problèmes par sa facilité notamment.

    je travaille pour une société import/export où il y a différents services (logistique, transport, ...).
    Tout le temps, les utilisateurs peuvent modifier une fiche article (nous avons des tas d'infos renseignées pour une fiche article, mais y a d'autres tables de ce genre) grâce à un système de reservation/libération avec un vieux 'SGBD'. Et si la session de l'utilisateur plante, ces fiches réservées sont libérées.
    Il faut vraiment que personne ne puisse modifier une fiche si un autre en fait la modification PENDANT UN CERTAIN TEMPS (le temps que l'autre renseigne les infos) mais on peut y acceder en read.

    J'avais pensé à une table de reservation (untel reserve telle fiche) mais qu'advient il si une session plante?
    Ce sont des interrogations pour une hypothétique migration de notre système.

  8. #8
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    Solution que j'ai déjà implémentée et qui fonctionne correctement :
    * on ne locke personne, car ça crée des problèmes de deadlock après ...
    * on ajoute sur toutes les tables modifiables par IHM un champ de "date de dernière mise à jour"
    * on passe la valeur de la dernière mise à jour sur les pages de modification
    * au moment d'un update, on regarde si la date de dernière modification stockée en base correspond à celle passée en paramètre ; si oui, on fait l'update (notamment la date de màj) et c'est bon ; si non, on renvoie un warning à l'utilisateur en lui indiquant que la fiche a été mise à jour (éventuellement, on peut même lui montrer les différences de valeurs au niveau de chaque champ : nouvelle valeur stockée VS valeur saisie)

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    - l'autre utilisateur (il voit toujours poids=10..) saisie volume=5 et fait un update avec ses données de l'ecran -> on revient à poids=10
    Il faut peut-être que l'application actualise la fiche avant d'entrer en mode modification. Mais en quoi est-ce que ce problème ne se pose pas déjà avec le SGBD actuel? C'est un problème fonctionnel, pas technique.

Discussions similaires

  1. procédure stockée : Verrou / accès concurrent
    Par florent_g dans le forum Développement
    Réponses: 8
    Dernier message: 01/07/2011, 17h19
  2. Réponses: 22
    Dernier message: 25/08/2005, 16h03
  3. Lenteur et acces concurrent
    Par JeanMarc_T2k dans le forum Bases de données
    Réponses: 7
    Dernier message: 04/12/2004, 20h57
  4. acces concurrent avec delphi 5 entreprise
    Par Jean_paul dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 20h19
  5. [EJB] Accès concurrents à la base de données
    Par cameleon2002 dans le forum Java EE
    Réponses: 10
    Dernier message: 23/09/2003, 11h31

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