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

C# Discussion :

Update concurrent comment gérer?


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Points : 43
    Points
    43
    Par défaut Update concurrent comment gérer?
    Bonjour,

    j'ai une appli C# qui se connecte à une bdd MySQL.
    Dans mon appli, j'ai une liste qui affiche des salles de conférence. Quand je clique sur une salle, une autre liste se charge avec les disponibilités de cette salle (par exemple lundi 8h00, lundi 14h00, lundi 16h00, mardi 8h00...).
    Je clique alors sur la disponibilité qui me convient et je clique sur "Réserver". TOUT FONCTIONNE!!!!

    Seulement mes utilisateurs n'utilisent pas l'appli comme je le pensais. En fait, ils sélectionnent la salle, la liste des dispo est donc affichée. Puis ils restent sur cette fenêtre quelques secondes ou minutes, puis seulement clique sur "Réserver". Seulement entre temps une autre utilisateur a peut être réservé la salle et cette dispo. Je mets à jour 2 tables pour la réservation.

    J'ai voulu utilisé SELECT FOR UPDATE mais j'ai pas l'impression que ce soit fait pour moi. J'ai fait une procédure pour la mise à jour des 2 tables, car parfois, je mettais à jour une table et pas l'autre car ça plantait au milieu. Mais ça ne règle pas ce problème d'accès concurrent. Que me conseillez vous? J'imaginais vérifier sur la dispo est toujours dispo avant de mettre à jour.

    Par avance, merci.

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Il faut que tu vérifies que la disponibilité soit toujours valable avant de vouloir enregistrer la réservation. Tu peux faire ça avec une simple requête SELECT. Ensuite tu auras deux scénarios à gérer :
    1. Soit la dispo est toujours présente, donc tu enregistres la réservation
    2. Soit elle n'est plus valide, et tu affiches un message à l'utilisateur pour lui indiquer qu'il doit en choisir une autre.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Points : 43
    Points
    43
    Par défaut
    C'est bien ce que j'imaginais. Merci.

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour traiter techniquement le probleme, il suffit de mettre dans la requete UPDATE une condition WHERE sur le champ indiquant la disponibilité.
    Si aucun enregistrement n'a été modifié (Count retourné par la requête egal à 0), tu affiches un message à l'utilisateur.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    et idéalement rafraichir la fenetre vu qu'elle reste ouverte longtemps (soit faire un refresh toutes les secondes ou faire un système de notification de mise à jour)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Il faut que tu vérifies que la disponibilité soit toujours valable avant de vouloir enregistrer la réservation. Tu peux faire ça avec une simple requête SELECT. Ensuite tu auras deux scénarios à gérer :
    1. Soit la dispo est toujours présente, donc tu enregistres la réservation
    2. Soit elle n'est plus valide, et tu affiches un message à l'utilisateur pour lui indiquer qu'il doit en choisir une autre.
    Il faut faire cela dans une transaction, sinon tu ne résouds pas le problème des réservations concurrentes.

    La méthode proposée par Graffito est plus simple et comme l'a dit Pol63 l'utilisateur appreciera que la fenêtre se rafraichisse.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    avec la méthode de faire un select pour voir si c'est toujours dispo, et si c'est le cas faire un update dans la foulée est potentiellement une source de bug
    car entre le select et l'update il y a pu avoir un update (enfin un autre select suivi d'un update vu que le code sera le même)
    avec une transaction ca va laisser un verrou entre les 2 interdisant quelqu'un d'autre de faire un update pendant ce temps là (bien qu'il faille vérifier qu'un select dans une transaction laisse son verrou)

    avec un update where not déjà pris il n'y a pas de problème, les update posent des verrous exclusifs empechant un autre update simultanné et quand le 1er sort pour le 2ème la condition ne sera plus vraie
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ah oui effectivement, au temps pour moi.. A force de faire 36 choses à la fois je suis passé un peu à côté du sujet

    Merci Pol63 et meziantou pour m'avoir fait remarquer ce point.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

Discussions similaires

  1. Comment gérer l'accès concurrent de threads à une map STL C++ ?
    Par masterx_goldman dans le forum Windows
    Réponses: 1
    Dernier message: 15/09/2009, 15h55
  2. [Etat] Comment gérer des états concurrents (parallèles).
    Par Damien.Garrido dans le forum Design Patterns
    Réponses: 5
    Dernier message: 18/08/2008, 17h34
  3. Comment gérer ma carte réseau en ASM
    Par will1974 dans le forum Assembleur
    Réponses: 6
    Dernier message: 23/09/2003, 17h08
  4. Comment gérer la touche echap ?
    Par Adrael dans le forum C
    Réponses: 28
    Dernier message: 11/07/2003, 13h15
  5. Comment gérer les espaces blancs?
    Par Lambo dans le forum XML/XSL et SOAP
    Réponses: 10
    Dernier message: 16/05/2003, 09h44

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